面向對象-其他
- 面向對象三大特性
- 類屬性和執行個體屬性
- 類方法和靜态方法
一. 面向對象三大特性
- 封裝
- 将屬性和方法書寫到類的裡面的操作即為封裝
- 封裝可以為屬性和方法添加私有權限
- 繼承
- 子類預設繼承父類的所有屬性和方法
- 子類可以重寫父類屬性和方法
- 多态
- 傳入不同的對象,産生不同的結果
二. 多态
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 靜态方法特點
- 需要通過裝飾器
來進行修飾,靜态方法既不需要傳遞類對象也不需要傳遞執行個體對象(形參沒有self/cls)。@staticmethod
- 靜态方法 也能夠通過執行個體對象和類對象去通路。
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():