python之中特性(attribute)與屬性(property)有什麼區別?
阿新 • • 發佈:2020-07-28
屬性(property)是一種特殊的特性(attribute)。
如下,我們定義了一個圓圈類(circle),圓圈嘛,自然就有直徑(diameter)和半徑(radius),我們可以設定他們為特性(attribute)。
class Circle(object):
def __init__(self, radius,diameter):
self.radius = radius
self.diameter = diameter
然後進行例項化,打印出特性(attribute)值,並更改示例的特性(attribute)值,再次列印它們的值
class Circle(object): def __init__(self, radius,diameter): self.radius = radius self.diameter = diameter # 例項化 my_circle = Circle(2,4) print('radius is {}'.format(my_circle.radius)) print('diameter is {}'.format(my_circle.diameter)) # 將直徑改為6 my_circle.radius = 6 print('radius is {}'.format(my_circle.radius)) print('diameter is {}'.format(my_circle.diameter))
執行結果如下
radius is 2
diameter is 4
radius is 6
diameter is 4
我們發現,半徑(radius)為2的時候,直徑(diameter)為4。但是我們把半徑改為6的時候,按照常理直徑應該為8,但此時直徑仍為4。因此我們希望程式能夠自動根據我們的半徑值計算出對一個的直徑,也能根據直徑計算出對應的一個半徑,這時候我們就需要@property了。
我們修改原來的程式碼如下:
class Circle(object): def __init__(self, radius): self.radius = radius @property def diameter(self): return self.radius * 2 @diameter.setter def diameter(self, new_diameter): self.radius = new_diameter / 2 # 例項化物件 my_circle = Circle(2) print('radius is {}'.format(my_circle.radius)) print('diameter is {}'.format(my_circle.diameter)) # 將半徑改為6 my_circle.radius = 6 print('radius is {}'.format(my_circle.radius)) print('diameter is {}'.format(my_circle.diameter)) # 將直徑改為6 my_circle.diameter = 6 print('radius is {}'.format(my_circle.radius)) print('diameter is {}'.format(my_circle.diameter))
此時結果如下
radius is 2
diameter is 4
radius is 6
diameter is 12
radius is 3.0
diameter is 6.0
從上可知,property其實就是一個帶有函式功能的attribute,attribute的值是靜態的,而property是一個動態的attribute,我們可以根據需要改變它的值。
而在本質上,property能夠實現這個動態的改變值的功能,是由於它有_get__、__set__ 和 __delete__方法。我們上面給diameter增加了@property和@diameter.setter,就是給diameter這個特性(attribute)增加了__get
所以說屬性(property)是一種特殊的特性(attribute)。
我們現在一般常把attribute稱作屬性,那麼對應的我們把property理解為屬性函式,或許這樣更能與它們的特性和功能對應了。
參考文件