Python中property特性属性是什么

在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@propertydef 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。显然,只读方法不支持赋值。

把私有变量变成可赋值的特性

我们只需要在上述代码改造成:

class MyClass:def __init__(self, x):self._x = x@propertydef x(self):return self._x@x.setterdef 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 = xdef get_x(self):return self._xdef set_x(self, value):self._x = valuex = property(get_x, set_x)
>>> obj = MyClass(10)
>>> obj.x
10

如上,x是property的实例,设置了getter和setter,作为类变量放在MyClass类中。

以上就是property属性的解析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/310167.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遇到DDOS怎么办,盾真的可以抗攻击吗

网络在以难以想象的速度发展&#xff0c;黑客们针对网络漏洞发起的攻击也从未停止&#xff0c;但复杂的网络环境让网络安全的维护更为艰难&#xff0c;如果游戏公司没有做好防御措施&#xff0c;黑客发起攻击只是时间问题。在网络攻击愈加多元化的今天&#xff0c;游戏行业可以…

【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

文章目录 &#x1f4dd;前言&#x1f320; 联合体类型的声明&#x1f309;联合体的特点 &#x1f320;相同成员的结构体和联合体对⽐&#x1f309;联合体⼤⼩的计算 &#x1f320;联合体应用&#x1f309;枚举类型的声明 &#x1f320;枚举类型的优点&#x1f309; 枚举类型的使…

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件&#xff0c;其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具&#xff0c;用于提供各种有用的代码规范、编…

[Angular] 笔记 22:ElementRef

chatgpt: ElementRef 是 Angular 中的一个类&#xff0c;它用于包装对 DOM 元素的引用。它允许开发者直接访问与 Angular 组件关联的宿主 DOM 元素。 当在 Angular 中需要直接操作 DOM 元素时&#xff0c;可以使用 ElementRef。通常情况下&#xff0c;最好避免直接操作 DOM&a…

八皇后问题(C语言)

了解题意 在一个8x8的棋盘上放置8个皇后&#xff0c;使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后&#xff1f; 解决这个问题的目标是找到所有符合要求的皇后摆放方式&#xff0c;通常使用回溯算法来求解。回溯算法会尝试所有可能…

56.网游逆向分析与插件开发-游戏增加自动化助手接口-通过UI分析自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一节内容&#xff1a;自动药水设定功能的逆向分析-CSDN博客 这次是假设没有之前的思路积累的话&#xff0c;怎样去找按钮事件。 通过ui当做切入点去做&#xff0c;就是一个窗口它显示不显示&#xff0c;游戏怎样控制这个…

STL——集合算法

算法简介&#xff1a; set_intersection // 求两个容器的交集set_union // 求两个容器的并集set_difference // 求两个容器的差集 1.set_intersection 函数原型&#xff1a; set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);…

史上最好用的SSH工具,好用到超出你的想象

给大家推荐一个功能强大&#xff0c;跨平台切风格很现代化的SSH管理工具——Xterminal。 1、功能特点 布局自由 命令管理 酷炫皮肤 在线编辑 文件上传方式多样 本地融合显示 支持rzsz 文件断点上传 服务器监控 2、来吧&#xff0c;展示 布局自由 双击修改标题 自…

.FileZilla的使用和主动模式被动模式介绍

FileZilla的使用和主动模式被动模式介绍 1.FileZilla的使用和主动模式被动模式介绍1.安装下载2.新建组和用户2.1打开后出现如下界面2.2点击编辑打开组这个选项2.3点击添加组以后&#xff0c;点击确认2.4输入组的名称&#xff0c;列如我输入的niyin2.5点击用户选项2.6像上面一样…

【owt-server】一些构建项目梳理

【owt-server】清理日志&#xff1a;owt、srs、ffmpeg 【owt】p2p client mfc 工程梳理【m98】webrtc vs2017构建带符号的debug库【OWT】梳理构建的webrtc和owt mfc工程 m79的mfc客户端及owt-client

K8S容器的一则故障记录

一、故障现象 XXX反馈说某某业务服务异常&#xff0c;无法启动&#xff0c;需要进行协助排查。经常会接到这样一个需求&#xff0c;一开始无法清楚知道具体什么问题&#xff0c;需要跟一线运维人员详细做沟通&#xff0c;了解故障问题的细节。 根据一线运维人员的反馈&#xff…

git基础概念和常用命令(日常开发收藏备用)

目录 ### 常用命令 ### 远程仓库与克隆 ### 分支管理 ### 子模块&#xff08;Submodule&#xff09; ### 其他高级操作 ### 交互式暂存&#xff08;Interactive Staging&#xff09; ### cherry-pick ### rebase ### reflog与reset ### 子树合并&#xff08;Subtree …