python之⾯向物件-多型
阿新 • • 發佈:2021-02-17
python之⾯向物件-多型
⼀. ⾯向物件三⼤特性
封裝
- 將屬性和⽅法書寫到類的⾥⾯的操作即為封裝
- 封裝可以為屬性和⽅法新增私有許可權
繼承
- ⼦類預設繼承⽗類的所有屬性和⽅法
- ⼦類可以重寫⽗類屬性和⽅法
多型
- 傳⼊不同的物件,產⽣不同的結果
⼆. 多型
2.1 瞭解多型
多型指的是⼀類事物有多種形態,(⼀個抽象類有多個⼦類,因⽽多型的概念依賴於繼承)。 定義:多型是⼀種使⽤物件的⽅式,⼦類重寫⽗類⽅法,調⽤不同⼦類物件的相同⽗類⽅法,可以產⽣不同的執⾏結果 好處:調⽤靈活,有了多型,更容易編寫出通⽤的程式碼,做出通⽤的程式設計,以適應需求的不斷變化!- 定義⽗類,並提供公共⽅法
- 定義⼦類,並重寫⽗類⽅法
- 傳遞⼦類物件給調⽤者,可以看到不同⼦類執⾏效果不同
2.2 體驗多型
class Dog(object): def work(self): # ⽗類提供統⼀的⽅法,哪怕是空⽅法 print('指哪打哪...') class ArmyDog(Dog): # 繼承Dog類 def work(self): # ⼦類重寫⽗類同名⽅法 print('追擊敵⼈...') class DrugDog(Dog): def work(self): print('追查毒品...') class Person(object): def work_with_dog(self, dog): # 傳⼊不同的物件,執⾏不同的程式碼,即不同的work函式 dog.work() ad = ArmyDog() dd = DrugDog() daqiu = Person() daqiu.work_with_dog(ad) daqiu.work_with_dog(dd)
三. 類屬性和例項屬性
3.1 類屬性
3.1.1 設定和訪問類屬性
類屬性就是 類物件 所擁有的屬性,它被 該類的所有例項物件 所共有 。 類屬性可以使⽤ 類物件 或 例項物件 訪問。class Dog(object):
tooth = 10
wangcai = Dog()
xiaohei = Dog()
print(Dog.tooth) # 10
print(wangcai.tooth) # 10
print(xiaohei.tooth) # 10
類屬性的優點
記錄的某項資料 始終保持⼀致時
,則定義類屬性。
例項屬性
要求
每個物件 3.1.2 修改類屬性
類屬性只能通過類物件修改,不能通過例項物件修改,如果通過例項物件修改類屬性,表示的是建立了⼀個例項屬性。class Dog(object):
tooth = 10
wangcai = Dog()
xiaohei = Dog()
# 修改類屬性
Dog.tooth = 12
print(Dog.tooth) # 12
print(wangcai.tooth) # 12
print(xiaohei.tooth) # 12
# 不能通過物件修改屬性,如果這樣操作,實則是建立了⼀個例項屬性
wangcai.tooth = 20
print(Dog.tooth) # 12
print(wangcai.tooth) # 20
print(xiaohei.tooth) # 12
3.2 例項屬性
class Dog(object):
def __init__(self):
self.age = 5
def info_print(self):
print(self.age)
wangcai = Dog()
print(wangcai.age) # 5
# print(Dog.age) # 報錯:例項屬性不能通過類訪問
wangcai.info_print() # 5
四. 類⽅法和靜態⽅法
4.1 類⽅法
4.1.1 類⽅法特點
需要⽤裝飾器 @classmethod 來標識其為類⽅法,對於類⽅法, 第⼀個引數必須是類物件 ,⼀般以 cls 作為第⼀個引數。4.1.2 類⽅法使⽤場景
當⽅法中 需要使⽤類物件 ( 如訪問私有類屬性等 ) 時,定義類⽅法 類⽅法⼀般和類屬性配合使⽤class Dog(object):
__tooth = 10
@classmethod
def get_tooth(cls):
return cls.__tooth
wangcai = Dog()
result = wangcai.get_tooth()
print(result) # 10
4.2 靜態⽅法
4.2.1 靜態⽅法特點
需要通過裝飾器 @staticmethod 來進⾏修飾, 靜態⽅法既不需要傳遞類物件也不需要傳遞例項物件(形參沒有self/cls ) 。 靜態⽅法 也能夠通過 例項物件 和 類物件 去訪問。4.2.2 靜態⽅法使⽤場景
當⽅法中 既不需要使⽤例項物件 ( 如例項物件,例項屬性 ) , 也不需要使⽤類物件 ( 如類屬性、類⽅法、建立例項等) 時,定義靜態⽅法 取消不需要的引數傳遞 ,有利於 減少不必要的記憶體佔⽤和效能消耗class Dog(object):
@staticmethod
def info_print():
print('這是⼀個狗類,⽤於建立狗例項....')
wangcai = Dog()
# 靜態⽅法既可以使⽤物件訪問⼜可以使⽤類訪問
wangcai.info_print()
Dog.info_print()
執行結果:
五. 總結
⾯向物件三⼤特性- 封裝
- 繼承
- 多型
- 歸屬於類物件的屬性,所有物件共有的屬性
@classmethod
def xx():
程式碼
靜態⽅法
@staticmethod
def xx():
程式碼