1. 程式人生 > 其它 >python之⾯向物件-多型

python之⾯向物件-多型

技術標籤:python基礎python多型封裝

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():
   程式碼