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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM