屬性(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__ 和 __set__方法,從而通過調用這兩個方法去改變了原來靜態的特性(attribute)值,使它成為了一個屬性(property)。
所以說屬性(property)是一種特殊的特性(attribute)。
我們現在一般常把attribute稱作屬性,那么對應的我們把property理解為屬性函數,或許這樣更能與它們的特性和功能對應了。
參考文檔