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理解为属性函数,或许这样更能与它们的特性和功能对应了。
参考文档