Python内置函数(51)——property
英文文档:
class property
(fget=None, fset=None, fdel=None, doc=None)
Return a property attribute.
fget is a function for getting an attribute value. fset is a function for setting an attribute value. fdel is a function for deleting an attribute value. And doc creates a docstring for the attribute.
If given, doc will be the docstring of the property attribute. Otherwise, the property will copy fget‘s docstring (if it exists). This makes it possible to create read-only properties easily using property()
as a decorator。
The @property
decorator turns the voltage()
method into a “getter” for a read-only attribute with the same name, and it sets the docstring for voltage to “Get the current voltage.”
A property object has getter
, setter
, and deleter
methods usable as decorators that create a copy of the property with the corresponding accessor function set to the decorated function.
说明:
1. property是一个类,其作用是用来包装类的属性,这个属性可以根据实际需要,控制是否可读(设置fget参数)、可写(设置fset参数)、可删除(设置fdel参数)。
class C:
def __init__(self):
self._x = '_x in C' def getx(self):
return self._x def setx(self, value):
self._x = value def delx(self):
del self._x x = property(getx, setx, delx, "I'm the 'x' property.")
>>> c = C()
>>> c.x # 调用 getx
'_x in C' >>> c.x = 'x had changed' # 调用 setx
>>> c.x # 调用 getx
'x had changed' >>> del c.x # 调用 delx
>>> c.x # 调用 getx
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
c.x
File "<pyshell#28>", line 6, in getx
return self._x
AttributeError: 'C' object has no attribute '_x'
2. 参数doc表示的是属性的说明,如果没有指定,将从fget参数指定的方法中读取。
>>> help(c)
Help on C in module __main__ object: class C(builtins.object)
| Methods defined here:
|
| __init__(self)
| Initialize self. See help(type(self)) for accurate signature.
|
| delx(self)
|
| getx(self)
|
| setx(self, value)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| x
| I'm the 'x' property. # 最后一行中 文档字符串 为I'm the 'x' property. >>> class C:
def __init__(self):
self._x = '_x in C' def getx(self):
"""I'm the 'x' property. provide by getx"""
return self._x def setx(self, value):
self._x = value def delx(self):
del self._x x = property(getx, setx, delx) >>> help(C)
Help on class C in module __main__: class C(builtins.object)
| Methods defined here:
|
| __init__(self)
| Initialize self. See help(type(self)) for accurate signature.
|
| delx(self)
|
| getx(self)
| I'm the 'x' property. provide by getx
|
| setx(self, value)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| x
| I'm the 'x' property. provide by getx # 最后一行中 文档字符串 为 I'm the 'x' property. provide by getx
3. property更优雅的做法是用作装饰器,装饰过的方法就可以以属性方式调用。同时将生成.setter和.deleter装饰器,用于指定可入方法,删除方法。
>>> class C:
def __init__(self):
self._x = '_x in C' @property
def x(self):
"""I'm the 'x' property."""
return self._x @x.setter
def x(self, value):
self._x = value @x.deleter
def x(self):
del self._x
>>> c = C()
>>> c.x # 调用 getx
'_x in C' >>> c.x = 'x had changed' # 调用 setx
>>> c.x # 调用 getx
'x had changed' >>> del c.x # 调用 delx
>>> c.x # 调用 getx
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
c.x
File "<pyshell#28>", line 6, in getx
return self._x
AttributeError: 'C' object has no attribute '_x'
4. 不直接使用字段,而使用属性,主要因为可以控制外部对类字段的恶意修改和删除,而且可以再设置属性值的时候进行适当的验证。
>>> class C:
def __init__(self):
self._name = ''
@property
def name(self):
"""i'm the 'name' property."""
return self._name
@name.setter
def name(self,value):
if value is None:
raise RuntimeError('name can not be None')
else:
self._name = value >>> c = C() >>> c.name # 访问属性
''
>>> c.name = None # 设置属性时进行验证
Traceback (most recent call last):
File "<pyshell#84>", line 1, in <module>
c.name = None
File "<pyshell#81>", line 11, in name
raise RuntimeError('name can not be None')
RuntimeError: name can not be None >>> c.name = 'Kim' # 设置属性
>>> c.name # 访问属性
'Kim' >>> del c.name # 删除属性,不提供deleter则不能删除
Traceback (most recent call last):
File "<pyshell#87>", line 1, in <module>
del c.name
AttributeError: can't delete attribute
>>> c.name
'Kim'
Python内置函数(51)——property的更多相关文章
- Python内置函数之-property
property 是一个内置的装饰器函数,只在面向对象中使用 求一个圆的周长和面积 # 周长和面积都是通过类的方法得到from math import pi class Cricle: def __i ...
- Python内置函数(63)——property
英文文档: class property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget is ...
- Python内置函数(51)——hasattr
英文文档: hasattr(object, name) The arguments are an object and a string. The result is True if the stri ...
- Python | 内置函数(BIF)
Python内置函数 | V3.9.1 | 共计155个 还没学完, 还没记录完, 不知道自己能不能坚持记录下去 1.ArithmeticError 2.AssertionError 3.Attrib ...
- Python 内置函数笔记
其中有几个方法没怎么用过, 所以没整理到 Python内置函数 abs(a) 返回a的绝对值.该参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 all(a) 如果元组.列表里面的所有元素都非 ...
- python内置函数大全(分类)
python内置函数大全 python内建函数 最近一直在看python的document,打算在基础方面重点看一下python的keyword.Build-in Function.Build-in ...
- python内置函数详细介绍
知识内容: 1.python内置函数简介 2.python内置函数详细介绍 一.python内置函数简介 python中有很多内置函数,实现了一些基本功能,内置函数的官方介绍文档: https: ...
- Python内置函数7
Python内置函数7 1.propertypython内置的一个装饰器可参考https://blog.csdn.net/u013205877/article/details/77804137 2.q ...
- Python内置函数6
Python内置函数6 1.license() 输出当前python 的license信息 A. HISTORY OF THE SOFTWARE ========================== ...
随机推荐
- datatable拆分多个
/// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分 ...
- 关于hadoop的运行的一些指标监控(非cdh平台的)
在hadoop-env.sh中添加: # 在配置namenode和datanode时都会有用到JMX_OPTS的代码,是为了减少重复提取出的公共代码 export JMX_OPTS="-Dc ...
- JIRA
https://www.jianshu.com/p/8c14b52ce692 JIRA这个工具接触有好几年了,在多个海外项目上都用过这个工具.去年又在项目上深度使用后就有点爱不释手了,回国后也在找机会 ...
- ISP PIPLINE (十五) AF
主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用). AF的大致原理就是检测图像锐度或者等价于锐度的参数,推动马达实现合焦或者对 ...
- Swagger2教程
Swagger2教程 作用:编写和维护接口文档. 一.Swagger2 + SpringBoot集成 1.依赖 <!--依赖管理 --> <dependencies> < ...
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
- 无代理处理post非简单请求跨域问题
express下 在处理纯http服务post请求的时候的跨域问题 即使在服务端先加入 Access-Control-Allow-Origin: *(get即时有效) 会出现 Failed to lo ...
- [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...
- PHP命名空间与自动加载类详解
本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...
- windows下输入git用户名和密码错误,重新输入用户名和密码
git clone https://YOUR_USERNAME@gitee.com.xxx.git将YOUR_USERNAME替换为该代码线的用户名,会弹出提示重新输入密码 每次windows提示输入 ...