python類的多態
多態,是指在同一類型下的不同形態。
比如下面這段代碼
class People:
def speak(self):
pass
class American(People):
def speak(self):
print("Hello, boys")
class Chinese(People):
def speak(self):
print("你好,老鐵")
p1 = American()
p2 = Chinese()
American 和 Chinese 都繼承了 People 類,但他們在 speak() 函數下,卻有不同的形態表現。American 說英文,Chinese 說漢語。
倘若現在有一個 do_speak 函數
def do_speak(people):
people.speak()
do_speak(p1)
do_speak(p2)
那么無論傳入的 American 實例還是 Chinese 實例,只要他有實現 speak 方法都可以。
這就是 Python 中非常有名鴨子類型:一個對象只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。
套入剛剛的代碼實例中,就是一個對象,只要有 speak 方法,那么他就是一個 do_speak 方法所需要的 people 對象。
類的 property 屬性
在之前的學習中,對象的屬性,我們都是通過把變量值賦值給對象本身來實現的。
>>> class Student:pass
...
>>>
>>> s = Student()
>>> s.name = "王炳明"
>>> s.age = 27
直接賦值會存在一個問題,就是無法對屬性值進行合法性較驗,比如我給 age 賦值的是負數,在業務上這種數據是不合法的。但上面那種寫法是無法檢查出來的。
>>> s.age = -27
>>> s.age
-27
為了實現屬性的合法性校驗,Python 引入的 property 屬性。
請看下面這段代碼
class Student:
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if 0 <= value <= 150:
self._age = value
else:
raise ValueError("Valid value must be in [0, 150]")
此時再對 age 屬性進行賦值就會對 value 的值進行合法性檢查,小于 0 或者 大于 150 的都是不合法數據。
>>> s = Student()
>>> s.age = -27
Traceback (most recent call last):
File "", line 1, in
File "", line 10, in age
ValueError: Valid value must be in [0, 150]
由此我們知道了 property ,其實是 Python 中一個內置的裝飾器,它可以在新式類中把一個函數 改造 成屬性。
當你讀取屬性值時,會進入被 property 裝飾的函數。
當你對屬性進行賦值時,會進入被 @xx.setter 裝飾的函數。
兩個裝飾器,一定是 @property 在前面,而 @xx.setter 在后
審核編輯:符乾江
-
面向對象
+關注
關注
0文章
64瀏覽量
10251 -
python
+關注
關注
57文章
4876瀏覽量
90024
發布評論請先 登錄
5類水晶頭和6類水晶頭可以混用不
如何分辨五類六類網線
6類水晶頭能向下兼容5類網線嗎?
用5類水晶頭接6類網線會有什么后果?
圖解碼說-六大UML類圖關系(依賴,繼承,實現,關聯,聚合,組合)
六類跳線VS超五類/超六類——如何選擇“網絡血管”?
超六類網線水晶頭和六類水晶頭通用嗎
超六類跳線是否可以接到六類配線架
五類網線接口能插六類網線嗎
網線面板分五類六類嗎
五類網線能用六類水晶頭嗎
python類的多態和類的property屬性
評論