Python“属性”和“属性”有什么区别?

我通常对“财产”和“属性”之间的区别感到困惑,找不到一个很好的资源来简洁地描述这些差异。

属性是一种特殊的属性。 基本上,当Python遇到以下代码:

spam = SomeObject() print(spam.eggs) 

它会查找spam eggs ,然后检查eggs是否有__get____set____delete__方法 – 如果是,则为属性。 如果它一个属性,而不是只返回eggs对象(就像其他任何属性一样),它会调用__get__方法(因为我们正在查找)并返回该方法返回的内容。

有关Python的数据模型和描述符的更多信息。

有一个属性,你可以完全控制他的getter,setter和deleter方法,但是你没有(如果不使用警告的话)属性。

 class A(object): _x = 0 '''A._x is an attribute''' @property def x(self): ''' Ax is a property This is the getter method ''' return self._x @x.setter def x(self, value): """ This is the setter method where I can check it's not assigned a value < 0 """ if value < 0: raise ValueError("Must be >= 0") self._x = value >>> a = A() >>> a._x = -1 >>> ax = -1 Traceback (most recent call last): File "ex.py", line 15, in <module> ax = -1 File "ex.py", line 9, in x raise ValueError("Must be >= 0") ValueError: Must be >= 0 

一般而言,术语属性和属性是相同的。 然而,Python中有一个属性装饰器,它提供了对属性(或其他数据)的getter / setter访问。

 class MyObject(object): # This is a normal attribute foo = 1 @property def bar(self): return self.foo @bar.setter def bar(self, value): self.foo = value obj = MyObject() assert obj.foo == 1 assert obj.bar == obj.foo obj.bar = 2 assert obj.foo == 2 assert obj.bar == obj.foo 

该属性允许你像普通属性一样获取和设置值,但是下面有一个方法被称为将它转换为你的getter和setter。 这是一个方便,以减less调用getter和setters的样板。

比方说,例如,你有一个类,它为你需要的东西保存了一些x和y坐标。 设置他们,你可能想要做的事情如:

 myObj.x = 5 myObj.y = 10 

比写作更容易看和考虑:

 myObj.setX(5) myObj.setY(10) 

问题是,如果有一天你的课程改变了,你需要用一些价值来抵消你的x和y? 现在您需要进入并更改您的类定义以及所有调用它的代码,这可能非常耗时且容易出错。 该属性允许您使用前者的语法,同时给予后者更改的灵活性。

在Python中,可以使用属性函数定义getter,setter和delete方法。 如果你只是想要读取属性,也可以在你的方法上面添加@property装饰器。

http://docs.python.org/library/functions.html#property

我从Bernd Klein 网站了解到2个不同之处,总结如下:

1.属性是一种更方便的数据封装方式。

例如:如果你有一个公共属性长度的对象,稍后,你的项目需要封装它,即:将其更改为私有,并提供getter和setter =>您必须更改以前编写的许多代码:

 #Old codes obj1.length=obj1.length+obj2.length #New codes(Using private attibutes and getter and setter) obj1.set_lenght(obj1.get_length()+obj2.get_length()) #=> this is ugly 

如果你使用@property和@ lenght.setter =>你不需要改变那些旧的代码

2.属性可以封装多个属性

 class Person: def __init__(self, name, physic_health, mental_health): self.name=name self.__physic_health=physic_health #physic_health is real value in range [0, 5.0] self.__mental_health=mental_health #mental_health is real value in range [0, 5.0] @property def condition(self): health=self.__physic_health+self.__mental_health if(health<5.0): return "I feel bad!" elif health<8.0: return "I am ok!" else: return "Great!" 

在这个例子中, __physic_health__mental_health是私有的,不能直接从外部访问,外部类与它们交互的唯一方式是通过属性condition