python之中特性(attribute)与属性(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
还是不懂,没关系,我解释一下。例子中,我定义一个圆圈类,圆圈(circle)嘛,肯定有直径(diameter)有半径(radius)的,我可以简单的设置他们为attribute, 比如
class Circle(object): def __init__(self, radius,diameter): self.radius = radius self.diameter = diameter这样写没有问题,我们实例化的时候,比如
class Circle(object): def __init__(self, radius,diameter): self.radius = radius self.diameter = diametermy_circle = Circle(2,4)print(\u0026#39;radius is {}\u0026#39;.format(my_circle.radius))print(\u0026#39;diameter is {}\u0026#39;.format(my_circle.diameter))#change the radius into 6 my_circle.radius = 6print(\u0026#39;radius is {}\u0026#39;.format(my_circle.radius))print(\u0026#39;diameter is {}\u0026#39;.format(my_circle.diameter))看下运行结果
radius is 2diameter is 4radius is 6diameter is 4发现问题了没有?一开始的时候,我们让半径等于2,直径等于4,那是因为我们知道对圆圈来说啊,这是肯定的事情。但是实际写代码过程中,我可能要去更改我的半径,比如说,让半径等于6,当然我在让半径等于6的时候,直径怎么还是4?因为代码不知道直径是半径的2倍,当然我可以暴力的把直径改为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 / 2my_circle = Circle(2)print(\u0026#39;radius is {}\u0026#39;.format(my_circle.radius))print(\u0026#39;diameter is {}\u0026#39;.format(my_circle.diameter))#change the radius into 6 my_circle.radius = 6print(\u0026#39;radius is {}\u0026#39;.format(my_circle.radius))print(\u0026#39;diameter is {}\u0026#39;.format(my_circle.diameter))#change the diameter into 6 my_circle.diameter = 6print(\u0026#39;radius is {}\u0026#39;.format(my_circle.radius))print(\u0026#39;diameter is {}\u0026#39;.format(my_circle.diameter))结果是不是和我一样?
radius is 2diameter is 4radius is 6diameter is 12radius is 3.0diameter is 6.0现在明白了么?其实property是一个有点函数意思的attribute,两者虽然字面上一致,或者说翻译成中文意思上基本没差别,但使用上是完全俩个不同的东东。如果实在理解不了,可以先跳过去,等用到或者碰到的时候,跑一下代码就明白了:)
至于你下面pygame的那个问题,我还是建议你去找例子跑代码运行,老实说,简单的让我不知道怎么回答:)


推荐阅读