多态、類方法、類屬性
-
面向對象三大屬性
(1)封裝
(2)繼承
(3)多态
2.多态:傳入不同的對象,産生不同的結果
2.1 實作步驟
(1)定義父類,提供公共方法
(2)定義子類,重寫父類方法
(3)傳遞子類對象給調用者,可以看到不同子類執行效果不同
# 定義父類 警犬和人
class Dog(object):
def work(self):
pass
class Person(object):
def work_with_dog(self,dog):
dog.work()
# 定義子類 警犬
class ArmyDog(Dog):
def work(self):
print('追擊敵人')
class DrugDog(Dog):
def work(self):
print('追擊毒品')
# 建立不同的對象進行調用
ad=ArmyDog()
dd=DrugDog()
xiaoming=Person()
xiaoming.work_with_dog(ad) #追擊敵人
xiaoming.work_with_dog(dd) #追擊毒品
3.類屬性和執行個體屬性
3.1 設定和通路類屬性
(1)類屬性就是類對象所擁有的屬性,它被該類的所有執行個體對象所共有
(2)類屬性可以使用類對象或執行個體對象通路
3.2 類屬性的優點
(1)記錄的某項資料始終保持一緻時,則定義類屬性
(2)執行個體屬性要求每個對象為其單獨開辟一份記憶體空間來記錄資料,而類屬性為全類所共有,僅占用一份記憶體,更加節省記憶體空間
# 1. 定義類,定義類屬性
class People(object):
tooth=10
# 2.建立對象
xiaoming=People()
zhangsan=People()
# 3.通路類屬性:類和對象
print(People.tooth) #10
print(xiaoming.tooth) #10
print(zhangsan.tooth) #10
3.3 修改類屬性
文法:類.類屬性=值
注意:類屬性隻能通過類對象修改,不能通過執行個體對象修改,如果通過執行個體對象修改類屬性,表示的是建立了一個執行個體屬性
# 1.定義類
class People(object):
tooth=10
# 2.建立對象
xiaoming=People()
zhangsan=People()
# # 3.1通過類對象修改類屬性
# People.tooth=20
# print(People.tooth) #20
# print(xiaoming.tooth) #20
# print(zhangsan.tooth) #20
# 3.2 通過執行個體對象修改類屬性
xiaoming.tooth=20
print(People.tooth) #10
print(xiaoming.tooth) #20
print(zhangsan.tooth) #10
4.類方法和靜态方法
4.1 類方法特點:
需要用裝飾器@classmethod來辨別其為類方法,對于類方法,第一個參數必須是類對象,一般用cls作為第一個參數
4.2 類方法使用場景
(1)當方法中需要使用類對象(如通路私有類屬性等)時,定義類方法
(2)類方法一般和類屬性配合使用
# 1.定義類
class People(object):
__tooth=10
# 定義類方法
@classmethod
def get_tooth(cls):
return cls.__tooth
# 2.建立對象,調用類方法
xiaoming=People()
result=xiaoming.get_tooth()
print(result) #10
4.3 靜态方法特點:
(1)需要用過裝飾器@staticmethod來修飾,靜态方法既不需要傳遞類對象也不需要傳遞執行個體對象(形參沒有self/cls)
(2)靜态方法也可以通過執行個體對象和類對象去通路
4.4 靜态方法使用場景
(1)當方法中既不需要使用執行個體對象(如執行個體對象,執行個體屬性),也不需要使用類對象(如類屬性,類方法,建立執行個體等)時,定義靜态方法
(2)取消不需要的參數傳遞,有利于減少不必要的記憶體占用和性能消耗
# 1.定義類,定義靜态方法
class People(object):
@staticmethod
def print_info():
print('這是一個靜态方法')
# 2.建立對象
xiaoming=People()
# 3.調用靜态方法:類和對象
xiaoming.print_info() #這是一個靜态方法
People.print_info() #這是一個靜态方法