1. 程式人生 > 實用技巧 >python之中特性(attribute)與屬性(property)有什麼區別?

python之中特性(attribute)與屬性(property)有什麼區別?

屬性(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理解為屬性函式,或許這樣更能與它們的特性和功能對應了。


參考文件

1.https://www.zhihu.com/question/40015172/answer/284427895

2.https://stackoverflow.com/questions/7374748/whats-the-difference-between-a-python-property-and-attribute