韩漫免费漫画在线观看方法,《好好疼爱里面》免费看,年轻漂亮的女士护士内衣,妈妈醉酒后把我当爸爸电视剧

文章 > Python基础教程 > Python中property特性属性是什么

Python中property特性属性是什么

头像

爱喝马黛茶的安东尼

2019-07-03 13:06:083110浏览 · 0收藏 · 0评论

在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量。

而在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, in <module>
    obj.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属性的解析。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

丫头把腿开大让我添添电影| 万人骑的大学生活笔趣阁 | 日本真人版免费PPT| NYLONJP| 学校教室里可以插自己电脑吗| 女性抹胸开襟哺乳衣的注意事项| 蜜桃成熟33D| 暴躁老阿姨CSGO技能推荐大全| 黑料| 臣卜扌桑扌圭辶鬲爸爸| 女性无裆连体内衣| 成品PPT网站大片入口| 自己怎么玩隐私位置游戏 | 男生和老师一起差差差的游戏| 老公带我到工地慰问老公滚| 禁忌1蜜桃熟了| 欲奴第二季电视剧全集在线看| 我老公跟我一晚上用很多卫生纸| 老师没戴套子C了我一天视频| 国产69精品久久久久久A片 | 《医务室上垒》动漫全集在线观看| 粘液共生1~3集免费观看动漫| 《漾出OVER FLOWER》..| B站暴躁少女CSGO| 成全在线观看免费完整版的| 强壮公借种日日躁我| 异性SPA按摩| 6969影院免费观看电视剧大全| 扌雷辶鬲的小说父女| 《深度》大尺度床戏| 亚洲精品-区二区三区在线| 我在开会他在下添的好爽| 狗和人胶配方20分钟一| 海角社区-吃瓜黑料-爆料海角| 少女第一次免费观看第二集| 老公把舌头放进我B里揽拌| 女人尝试到更粗大的心理变化 | 《初试云雨情》法国| 《年轻朋友的妻子3》| 白丝袜精华液抹在脚上的功效| 共享女儿小诗1~10章的背景资... 家族轮换之共乐的日子最新章节更,