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 ...
随机推荐
- SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的
上两篇文章我们主要讲解了Neo4j的基本知识以及Neo4j的基本使用,这篇文章我们就以实例来深入的理解一下,我们以社交电商中的绑定关系为例,使用SpringBoot+Neo4j来实现. Neo4j文章 ...
- 输入n个学生,并且输入成绩,判断是否偏科
H学校的领导主任决定分析一下今年所有N名学生的考试成绩,从中找出偏科的学生,考试成绩包含语文,数学,英语三门课程的分数,已知偏科的定义是:某一门课程的分数大于等于90,并且另外两门的分数小于等于70. ...
- javascript 实现中文按照拼音首字母排序
js提供了sort()方法来对数组内的数据进行排序,但是只是对英文有作用,这个时候需要自定义排序的规则 ['张三','李四','王五'].sort((a, b) => a.localeCompa ...
- 从源码角度了解SpringMVC的执行流程
目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMV ...
- Spring Boot2 系列教程 (十二) | 整合 thymeleaf
前言 如题,今天介绍 Thymeleaf ,并整合 Thymeleaf 开发一个简陋版的学生信息管理系统. SpringBoot 提供了大量模板引擎,包含 Freemarker.Groovy.Thym ...
- vue拦截器
1.在路由添加 meta:{ requireAuth:true } 完整 { path: '/xx', name: 'xx', component: xx, meta:{ requireAuth:tr ...
- 基于JS实现归并排序算法
/*********************************************JS归并排序************************************************ ...
- XML学习笔记——关于XML解析器
本篇文章基于W3C而写 在Firefox及其他浏览器中的XML解析器(除IE) var xmlDoc=document.implementation.createDocument("&quo ...
- Tomcat9乱码解决
在tomcat的解压目录下找到conf,打开进入,logging.properties文件,在该文件中,修改 java.util.logging.ConsoleHandler.encoding = U ...
- hbase伪分布式安装以及实例演示
参考指路:https://www.cnblogs.com/wang-jx/p/9672072.html (包含实例演示,这里就不copy人家的心血了) 1.下载对应安装包解压 1.1下载 同样建议选择 ...