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)。


参考文档

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

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

上一篇:[LeetCode] 543. Diameter of Binary Tree(二叉树的直径)


下一篇:CF804D Expected diameter of a tree 树的直径 根号分治