在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量。
10年积累的网站建设、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站策划后付款的网站建设流程,更有玉林免费网站建设让你可以放心的选择与我们合作。
而在python中,因为有Property这个概念,所以不需要写getter和setter一堆重复的代码来操作私有变量。Python“私有变量”通常在变量前加上“_”或者“__”,例如_attr或者__attr,这是约定俗成的规范。
把私有属性变成只读特性
class MyClass: def __init__(self, x): self._x = x
这里定义了一个MyClass类,它有一个实例变量_x,绑定了用户传来的x值。_x是私有变量,通过obj._x获取私有变量不符合语言规范,进而我们要使_x变成property(特性),通过obj.x直接访问。
改造后的代码如下:
class MyClass: def __init__(self, x): self._x = x @property def x(self): return self._x >>> obj = MyClass(10) >>> obj.x 10
我们把_x变成了property特性,以只读的方式获取x的值。
我们现在想为x赋值该怎样做呢?
>>> obj.x = 999 Traceback (most recent call last): File "xxx", line 14, inobj.x = 23 AttributeError: can't set attribute
可以看到,抛出了AttributeError: can't set attribute。显然,只读方法不支持赋值。
相关推荐:《Python视频教程》
把私有变量变成可赋值的特性
我们只需要在上述代码改造成:
class MyClass: def __init__(self, x): self._x = x @property def x(self): return self._x @x.setter def x(self, value): self._x = value >>> obj = MyClass(10) >>> obj.x = 999 >>> obj.x 999
可以看到,我们为x添加了setter,可以直接为obj.x赋值操作。
property属性能够遮盖实例属性
继续上面的代码,我们看看以下的操作:
>>> obj = MyClass(10) >>> obj.__dict__ {'_x': 999} #此时实例变量中有_x的值 >>> obj.__dict__['x'] = 99999 #设置obj的实例变量有x值,跟property属性重名! >>> obj.__dict__ {'_x': 999, 'x': 99999} #此时实例变量中有_x和x的值 >>> obj.x #结果是obj的实例变量还是property属性? 10
如上代码所示,obj对象有一个_x实例变量和一个x的property属性,我们又强行为obj增加了一个x实例变量,这个实例变量x和property属性x同名!
通过obj.x我们得知,返回的是property属性,说明property属性会遮盖实例属性!也可以理解为property属性的优先级更大!
property类解析
我们通常使用内置的@property装饰器。但其实property是一个类,python中类和函数的调用方式都差不多,他们都是可调用对象。
property的构造方法如下:
class property(object): def __init__(self, fget=None, fset=None, fdel=None, doc=None): """"""
它接受4个参数,都可以为空。
第一个为getter,第二个为setter,第三个为delete函数,第四个为文档。
上述代码的另一种写法
class MyClass: def __init__(self, x): self._x = x def get_x(self): return self._x def set_x(self, value): self._x = value x = property(get_x, set_x) >>> obj = MyClass(10) >>> obj.x 10
如上,x是property的实例,设置了getter和setter,作为类变量放在MyClass类中。
以上就是property属性的解析。
本文名称:创新互联Python教程:Python中property特性属性是什么
网页URL:http://www.shufengxianlan.com/qtweb/news18/242768.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联