python進階(五)~~~多態和屬性訪問
面向對象三大特征:
封裝:將數據和方法放在一個類中,構成封裝
繼承:子類繼承父類屬性和方法,可多繼承
多態:一個事物有多種形態,一個抽象類有多個子類,不同的子類對象調用相同的方法,產生不同的執行結果。多態可以增加代碼的靈活度。是基于類的繼承。
class Animal: def run(self): raise AttributeError('子類必須實現這個方法') class Pig(Animal): def run(self): print('pig is walking') class Dog(Animal): def run(self): print('dog is running') def func(obj): # python的函數參數 無任何類型限制,可以是類本身,也可以是類的對象 obj.run() pig1=Pig() d1=Dog() func(pig1) func(d1)
多態的意義:開放封閉原則
對于一個變量,我們只需要知道它的Base類型,無需知道它的子類型,就可以放心的調用相同的方法quack();
當需要新增功能時,只需新增一個Base的子類實現quack()方法,就可以在原基礎上擴展功能,即開放封閉原則:
對擴展開放:允許新增一個Base的子類;
對修改封閉:不要修改Base依賴類型的quack()函數;
鴨子類型
鴨子類型關注點在對象的行為,而不是類型。不要求嚴格的繼承體系。只要行為相似(內部實現相同的方法),即可視為鴨子類型。
class Duck: def __init__(self, name): self.name = name def quack(self): print("gua gua") class Man: def __init__(self, name): self.name = name def quack(self): print("女王大人") def do_quack(ducker): ducker.quack() if __name__ == '__main__': d = Duck('duck') m = Man('man') do_quack(d) do_quack(m)
數據類型和自省:
1. 私有屬性:類里面定義的屬性分為兩種:公有屬性和私有屬性
2. 私有屬性定義:
以單下劃線開頭_attr :類外部可以直接調用
以雙下劃線開頭的屬性__attr:類外部不能直接調用,被改名了,需要用 _類名__attr 訪問;
class People: # 初始化參數 def __init__(self, name): self.name = name self.__age = 18 # 在需要設置的屬性或方法前加雙下劃線,即設置私有屬性或私有方法 def display(self): print('%s的年齡是%d' % (self.name, self.__age)) XiaoAi = People('小愛同學') # 此時age屬性為私有屬性,不能進行外部訪問,否則會報錯 # print(XiaoAi.__age) # 以單下劃線+類名的顯示,可以訪問私有屬性 print(XiaoAi._People__age) XiaoAi.display()
3. python不能實現真正的私有屬性,但通過下劃線開頭,可以得到偽私有屬性。大部分python代碼遵循規則:以下劃線開頭的屬性為私有屬性,被視為非公開的API的一部分,僅用于實現細節。
4. __dict__: 類.__dict__:返回該類 屬性、方法的字典;實例.__dict__:返回實例的 屬性、方法字典;實例.方法.__dict__:返回方法的 屬性、方法字典
__doc__: 類.__doc__:返回該類的注釋說明;實例.方法.__doc__:返回方法的注釋說明 ;模塊.__doc__:返回py文件模塊的注釋說明文檔
__slots__:類的屬性范圍鎖定,僅允許綁定__slots__= [ ]列表中已有的屬性,可節約內存,提高性能。
自定義屬性訪問
內置函數:
getattr: 獲取屬性 ,觸發魔術方法 object.__getattr__()
setattr: 設置屬性,觸發魔術方法 object.__setattr__()
delattr: 刪除屬性,觸發魔術方法 object.__delattr__()
1. object.__getattr__:當我們訪問屬性的時候,如果屬性不存在(出現AttrError),該方法會被觸發。
2.object.__getattrible__: 訪問屬性的時候,第一時間觸發該方法去找屬性。如果沒找到觸發AttrError。當我們去訪問一個不存在的屬性時,首先會觸發__getattribute__,然后才會觸發__getattr__
如果屬性存在,就返回這個屬性值,如果沒有就報 AttrError
3.object.__setattr__:設置屬性
4.object.__delattr__:刪除屬性

浙公網安備 33010602011771號