類和對象
- 類: 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
-
實例變量:定義在方法中的變量,只作用于當前實例的類。
對“類”和“對象”的使用:
類就是一個模板,模板里可以包含多個函數,函數里實現一些功能。
對象則是根據模板創建的實例,通過實例對象可以執行類中的函數。
class Person(): # 類
height = 170 # 類變量
# 初始化函數,用來完成一些默認的設定
# 所謂的self,可以理解為自己
# 某個對象調用其方法時,python解釋器會把這個對象作為第一個參數傳遞給self,所以開發者只需要傳遞后面的參數即可
def __init__(self, name, age):
self.name = name # 實例變量
self.__age = age # 私有屬性
# 方法
def run(self):
print("跑")
def fight(self):
print("打架")
p = Person('小麥', 18) # 創建對象
私有屬性
- Python中沒有像C++中public和private這些關鍵字來區別公有屬性和私有屬性
- 它是以屬性命名方式來區分,如果在屬性名前面加了2個下劃線'__',則表明該屬性是私有屬性,否則為公有屬性(方法也是一樣,方法名前面加了2個下劃線的話表示該方法是私有的,否則為公有的)。
del()方法
- 創建對象后,python解釋器默認調用init()方法;
- 當刪除一個對象時,python解釋器也會默認調用一個方法,這個方法為del()方法
class Animal(object):
# 初始化方法
# 創建完對象后會自動被調用
def __init__(self, name):
print('__init__方法被調用')
self.__name = name
# 析構方法
# 當對象被刪除時,會自動被調用
def __del__(self):
print("__del__方法被調用")
print("%s對象馬上被干掉了..."%self.__name)
# 創建對象
dog = Animal("狗")
# 刪除對象
del dog
cat = Animal("貓")
cat2 = cat
cat3 = cat
print("---馬上 刪除cat對象")
del cat
print("---馬上 刪除cat2對象")
del cat2
print("---馬上 刪除cat3對象")
del cat3
輸出
__init__方法被調用
__del__方法被調用
狗對象馬上被干掉了...
__init__方法被調用
---馬上 刪除cat對象
---馬上 刪除cat2對象
---馬上 刪除cat3對象
__del__方法被調用
貓對象馬上被干掉了...
面向對象的三大特性
- 封裝:對外部世界隱藏對象工作的細節。
- 繼承:以普通類為基礎建立專門的類對象。
- 多態:可以對不同類的對象使用相同的操作。
- 單繼承
父類中的方法、屬性,子類會繼承。
# 定義一個父類,如下:
class Cat(object):
def __init__(self, name, color="白色"):
self.name = name
self.color = color
def run(self):
print("%s--在跑"%self.name)
# 定義一個子類,繼承Cat類如下:
class Bosi(Cat):
def setNewName(self, newName):
self.name = newName
def eat(self):
print("%s--在吃"%self.name)
bs = Bosi("貓")
print('bs的名字為:%s'%bs.name)
print('bs的顏色為:%s'%bs.color)
bs.eat()
bs.setNewName('波斯貓')
bs.run()
運行結果
bs的名字為:貓
bs的顏色為:白色
貓--在吃
波斯貓--在跑
- 多繼承
class base(object):
def test(self):
print('----base test----')
class A(base):
def test(self):
print('----A test----')
# 定義一個父類
class B(base):
def test(self):
print('----B test----')
# 定義一個子類,繼承自A、B
class C(A,B):
pass
obj_C = C()
obj_C.test()
print(C.__mro__) #可以查看C類的對象搜索方法時的先后順序
運行結果
----A test----
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.base'>, <type 'object'>)
3.多態
多態的概念是應用于Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。所謂多態:定義時的類型和運行時的類型不一樣,此時就成為多態。
class F1(object):
def show(self):
print('F1.show')
class S1(F1):
def show(self):
print('S1.show')
class S2(F1):
def show(self):
print('S2.show')
# 為了讓Func函數既可以執行S1對象的show方法,又可以執行S2對象的show方法,所以,定義了一個S1和S2類的父類
# 而實際傳入的參數是:S1對象和S2對象
def Func(F1 obj):
"""Func函數需要接收一個F1類型或者F1子類的類型"""
print obj.show()
s1_obj = S1()
Func(s1_obj) # 在Func函數中傳入S1類的對象 s1_obj,執行 S1 的show方法,結果:S1.show
s2_obj = S2()
Func(s2_obj) # 在Func函數中傳入Ss類的對象 ss_obj,執行 Ss 的show方法,結果:S2.show