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瀏覽量
9983 -
python
+關注
關注
56文章
4793瀏覽量
84634
發布評論請先 登錄
相關推薦
評論