Property - 特性(Python)
Property - Python 特性
不同的书籍对 property 一词的翻译有所不同, 我们将 property 翻译成 '特性' 以区别于 attribute 一词.
先看看 property 类在 Python 中的定义,
结构,
class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
...
...
...
简略表示为,
class property(fget=None, fset=None, fdel=None, doc=None) 其中参数,
fget 是一个'取值'(get attribute value)函数
fset 是一个'设值'(set attribute value)函数
fdel 是一个'删除值'(delete attribute value)函数
doc 对所返回的 property attribute 的描述(docstring) property 的典型用法(以通过 property 管理属性 A.a 为例),
class A(object):
def __init__(self):
self._a = None def geta(self):
""" This docstring in fget method """
print('geta is called')
return self._a def seta(self, value):
print('seta is called')
self._a = value def dela(self):
print('dela is called')
del self._a a = property(geta, seta, dela, "Typical use of \'property\'")
#a = property(geta, seta, dela) if __name__ == '__main__':
tester1 = A()
print(vars(A)) #
print(vars(tester1)) #
tester1.a = 'hello world' #
print(tester1.a) #
del tester1.a #
print(vars(A)) #
print(vars(tester1)) #
print(A.a.__doc_) #
tester1.a = 'hello world2' #
print(vars(tester1)) #
print(tester1.a) Output,
{'__module__': '__main__', '__init__': <function A.__init__ at 0x02DB62B8>, 'geta': <function A.geta at 0x02DB6270>,
'seta': <function A.seta at 0x02DB6228>, 'dela': <function A.dela at 0x02DB61E0>, 'a': <property object at 0x02DB92A0>,
'__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
#1 类对象中存在被命名为 'a' property 对象 {'_a': None} #2 实例实际所拥有时是 _a,
seta is called #3 会调用 'seta'
geta is called
hello world #4 将调用 'geta'
dela is called #5 调用 'dela'
{'__module__': '__main__', '__init__': <function A.__init__ at 0x02DB62B8>, 'geta': <function A.geta at 0x02DB6270>,
'seta': <function A.seta at 0x02DB6228>, 'dela': <function A.dela at 0x02DB61E0>, 'a': <property object at 0x02DB92A0>,
'__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None} {} #6 实例的 '_a' 属性被删除
return self._a, AttributeError: 'A' object has no attribute '_a' #7 虽然调用了 del 类对象中仍然存在被命名为 'a' property 对象 Typical use of 'property' #8 第四个参数 docstring 存在, property a 的 __doc__ 属性为所提供 docstring 参数
This docstring in fget method #8 没有设置第四个该参数, 则 property a 的 __doc__ 会引用 geta 的 docstring seta is called #9 在次设置 property a
{'_a': 'hello world2'} #9 '_a' 回到 '实例' 属性中
geta is called #
hello world2 # 注, abc = A(), abc.a 将调用 'geta' ; abc.a = 3 会调用 'seta'; del abc.a 调用 'dela'
若第四个参数 docstring 存在, property a 的 __doc__ 属性为所提供 docstring 参数(A.a.__doc__);
若没有设置该参数, 则 property a 的 __doc__ 会引用 geta 的 docstring.
If abc is an instance of A, abc.a will invoke the getter, abc.a = value will invoke the setter and del abc.a the deleter.
If given, doc will be the docstring of the property attribute. Otherwise, the property will copy fget’s docstring (if it exists).
property 类, 更实用的是 以装饰器 @property 来实现 '只读' readonly 属性(若实例中没有实现 a.setter, a 便成为'只读' readonly 属性),
例子(与上例等价形式的 @property 的实现), class B(object):
def __init__(self):
self._a = None @property # 将 'a' 装饰成 property
def a(self):
""" This docstring in fget method"""
print('fget is called')
return self._a # The @property decorator turns the a() method into a “getter”
# for a read-only attribute with the same name, and it sets the
# docstring for a to “This docstring in fget method”
# 如类中没有实现 a.setter, a 便成为'只读' readonly 属性. @a.setter # 装饰 property a 的 setter
def a(self, value):
print('fset is called')
self._a = value @a.deleter # 装饰 property a 的 deleter
def a(self):
print('fdel is called')
del self._a *** 注, 务必保证 setter 和 deleter 所装饰的 '函数' 与 被装饰的 '特性' 函数 名字一致
Be sure to give the additional functions the same name as the original property (a in this case.)
Property - 特性(Python)的更多相关文章
- Python深入浅出property特性属性
导语 在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量. 而在Python中,因为有property这个 ...
- 类的property特性
目录 什么是 property特性 简单示例 property属性的两种方式 装饰器 类属性方式 property+类的封装 应用 私有属性添加getter和setter方法 使用property升级 ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- day36 类的三大特性---封装以及Property特性
目录 类的封装 如果真的要拿 类的property特性 setter & deleter 类属性用法 类与对象的绑定方法和非绑定方法 对象方法&类方法&静态方法 隐藏模块内的函 ...
- python 旧类中使用property特性的方法
在python中,我们可以拦截对象的所有特性访问.通过这种拦截的思路,我们可以在旧式类中实现property方法. __getattribute__(self, name) #当特性name被访问时自 ...
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...
- day22-类的封装、property特性以及绑定方法与非绑定方法
目录 类的封装 两个层面的封装 第一个层面 第二个层面 封装的好处 私有模块 类的propertry特性 setter 和 deleter 类与对象的绑定方法与非绑定方法 类的封装 将类的属性或方法隐 ...
- 封装、property特性及绑定与非绑定方法
1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...
- property特性
什么是property property是一种特殊属性,访问他时会执行一段功能然后返回值 class People: def __init__(self,name,weight,height): se ...
随机推荐
- js实现类选择器和name属性选择器
jQuery的出现,大大的提升了我们操作dom的效率,使得我们的开发更上一层楼,如jQuery的选择器就是一个很强大的功能,它包含了类选择器.id选择器.属性选择器.元素选择器.层级选择器.内容筛选选 ...
- 【转】ArcGIS Server 10.1 动态图层
ArcGISServer将GIS资源以服务的方式发布,能够让更多的人在Web上浏览.使用.不过,诸如气象.环保等方面的信息是实时变化的,按照之前常规的方法,我们先要将最新获得的信息组织成地图文档后再对 ...
- Longhorn入门级教程!轻松实现持久化存储!
介 绍 在本文中你将学会如何使用k3s在Civo上运行Longhorn.如果你还没使用过Civo,可以到官网注册(https://www.civo.com/ )还可以申请免费的使用额度.首先,需要一个 ...
- 根据输入参数,判定时间范围CheckTimeSpan
对于C#的开发的网页程式,一些企业或者工厂可能会运用这些程式去查询一些资料,考虑到查询的资料太多,假如一个月的资料就有上万条数据,在对于查询资料的SQL语句后时间栏位运用Between.....AND ...
- 【C_Language】---队列和栈的C程序实现
这几天总结了C语言的队列,栈的实现方法,在此总结一下:一.栈 首先从栈开始,诚然,相信学习过数据结构的你,肯定应该知道栈是什么东西了,如果不知道也没事每一句话我就可以帮你总结--数据只在栈顶进行插入和 ...
- SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
一:Eureka简介 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. ...
- 使用RobotFramework的JavaRemoteLibrary
终于被迫使用了Java的远程接口库(为了同时使用Java和python的用例库,且为了在pybot下跑速度能快一些),路途比实际想的要坎坷,记录下来. 远程库的原理在前边一篇文章中记录过: http: ...
- UidGenerator springboot2集成篇
uid-generator 官网集成文档: https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md 由于并没有提供spri ...
- 插画版Kubernetes指南
原文地址:https://www.cnblogs.com/kouryoushine/articles/8007648.html 是根据一个视频翻译过来的,比较形象 编者按:Matt Butcher 是 ...
- 异想家Ubuntu安装的软件
[替换国内源] https://developer.aliyun.com/mirror/ubuntu 我提供一个下载,方便第一次安装懒得敲命令: https://jfz.me/16.04/source ...