Python中property特性属性是什么
在Java中,通常在类中定义的成员变量是私有变量,在类实例中不能直接通过对象。属性是直接操作的,私有变量是通过geter和seter操作的。
在python中,由于property的概念,因此无需编写getter和setter的一堆重复代码来操作私有变量。Python“私有变量”通常在变量前添加“_”或“_”,如_attr或__attr,这是一个传统的规范。

将私有属性转化为只读特性
classMyClass: def__init__(self,x): self._x=x
这里定义了一个MyClass类,它有一个实例变量_x,绑定用户传输的x值。_x是通过obj的私有变量._x获取不符合语言规范的私有变量,然后我们想通过objjj将_x变成property(特征).x直接访问。
改造后的代码如下:
classMyClass: def__init__(self,x): self._x=x @property defx(self): returnself._x >>>obj=MyClass(10) >>>obj.x 10
我们将_x变成property特性,以只读的方式获得x值。
现在我们该怎么办才能给x赋值?
>>>obj.x=999 Traceback(mostrecentcalllast): File"xxx",line14,in<module> obj.x=23 AttributeError:can'tsetattribute
可以看出,Attributeroro被抛出: can't set attribute。显然,只读法不支持赋值。
相关推荐:Python视频教程
将私有变量转化为可赋值的特性
我们只需要将上述代码转换为:
classMyClass: def__init__(self,x): self._x=x @property defx(self): returnself._x @x.setter defx(self,value): self._x=value >>>obj=MyClass(10) >>>obj.x=999 >>>obj.x 999
可以看出,我们为x添加了setter,可以直接为objj添加setter.x赋值操作。
property属性可以覆盖实例属性
继续以上代码,我们来看看以下操作:
>>>obj=MyClass(10)
>>>obj.__dict__
{'_x':999}#此时实例变量中有_x值。
>>>obj.__dict__['x']=设置obj的实例变量有x值,与property属性重名!
>>>obj.__dict__
{'_x':999,'x':此时实例变量中有_x和x值
>>>obj.x#结果是obj的实例变量还是property属性?
10如上代码所示,obj对象具有_x实例变量和xproperty属性,我们强行为obj添加x实例变量,与property属性x同名!
通过obj.x我们知道返回的是property属性,说明property属性会覆盖实例属性!也可以理解为property属性更优先!
property类分析
我们通常使用内置的@property装饰品。但事实上,property是一个类别。python中类的调用方法与函数相似。它们都是可调用对象。
property的结构方法如下:
classproperty(object): def__init__(self,fget=None,fset=None,fdel=None,doc=None): """"""
它接受四个参数,可以是空的。
一是getter,二是setter,三是delete函数,四是文档。
上述代码的另一种写作方法
classMyClass: def__init__(self,x): self._x=x defget_x(self): returnself._x defset_x(self,value): self._x=value x=property(get_x,set_x) >>>obj=MyClass(10) >>>obj.x 10
以上,x是property的例子,设置了getter和setter,作为Myclass类的类变量。
以上是对property属性的分析。
