看了一下知乎上一位网友关于property的提问,有位网友的回答说的很通俗易懂,转过来分享一波。
原文链接:看‘蟒蛇游戏爱好者’的回答
先看普通的例子
class Circle(object):
def __init__(self, radius,diameter):
self.radius = radius
self.diameter = diameter
例子中,我定义一个圆圈类,直径(diameter),半径(radius)。
这样写没有问题,我们实例化的时候,比如
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))
#change the radius into 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
一开始的时候,我们让半径等于2,直径等于4。但是当更改半径时,必须手动把直径改为12,但我更希望,程序自己能在我把半径变成6的时候自动把直径变成12,或者当我需要改直径为10的时候,程序能把半径自动的变成5. 如果有这个需求的时候,@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))
#change the radius into 6
my_circle.radius = 6
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
#change the diameter into 6
my_circle.diameter = 6
print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))
其实property是一个有点函数意思的attribute,两者虽然字面上一致,或者说翻译成中文意思上基本没差别,但使用上是完全俩个不同的东西。
我比较喜欢的另一个通俗易懂的解释是:把方法当属性用。
写在最后:当然property还有其他用法,@property、@方法名.setter、@方法名.deleter,不是本文分享内容,不多作介绍。
2020最后一天,rm -rf '所有烦恼 ',欧力给!!
谢谢支持!