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)的更多相关文章

  1. Python深入浅出property特性属性

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

  2. 类的property特性

    目录 什么是 property特性 简单示例 property属性的两种方式 装饰器 类属性方式 property+类的封装 应用 私有属性添加getter和setter方法 使用property升级 ...

  3. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

  4. day36 类的三大特性---封装以及Property特性

    目录 类的封装 如果真的要拿 类的property特性 setter & deleter 类属性用法 类与对象的绑定方法和非绑定方法 对象方法&类方法&静态方法 隐藏模块内的函 ...

  5. python 旧类中使用property特性的方法

    在python中,我们可以拦截对象的所有特性访问.通过这种拦截的思路,我们可以在旧式类中实现property方法. __getattribute__(self, name) #当特性name被访问时自 ...

  6. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  7. day22-类的封装、property特性以及绑定方法与非绑定方法

    目录 类的封装 两个层面的封装 第一个层面 第二个层面 封装的好处 私有模块 类的propertry特性 setter 和 deleter 类与对象的绑定方法与非绑定方法 类的封装 将类的属性或方法隐 ...

  8. 封装、property特性及绑定与非绑定方法

    1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...

  9. property特性

    什么是property property是一种特殊属性,访问他时会执行一段功能然后返回值 class People: def __init__(self,name,weight,height): se ...

随机推荐

  1. UGUI源码之EventSystem

    今天研究下UGUI的源码,先从EventSystem入手.EventSystem是用来处理点击.键盘输入以及触摸等事件的. 1.BaseInputModule EventSystem开头声明了两个变量 ...

  2. Java Data类

    Date类的概述 java.util,Date 表示日期和时间的类类 Date 表示特定的瞬间,精确到千分之一秒(毫秒) 获取时间原点到当前系统时间经历了多少秒 // 时间原点:1970 年 01 月 ...

  3. 【ARM】---STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

  4. .net生成荣誉证书

    参考:https://blog.csdn.net/ljk126wy/article/details/84299373 采用生成pdf 方式  效果如下: 用adobe acrobat 制作一个模板  ...

  5. MySql笔记(一)

    目录 MySql笔记(一) 每天给自己一个希望,努力做好自己,不为明天烦恼,不为昨天叹息.当梦想还在,告诉自己:努力,就总能遇见更好的自己! MySql笔记(一) 1.创建数据库以及删除 1.创建数据 ...

  6. PageHelper踩坑

    刚开始死活分不了页,只显示默认的前 10条.搞了一下午,打了无数个断点都试不出毛病在哪. 下班又死磕到快8点,就在我已经绝望的时候,最后终于试出来了,把page.getTotal()给传到前端就好了. ...

  7. SpringMVC简单使用教程

    一.SpringMVC简单入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  8. 团队项目——Alpha发布2

    一.作业描述 这个作业属于哪个课程 这个作业要求在哪里 团队名称 CTRL-IKun 这个作业的目标 在这个星期内完成团队项目α版本的第二次测试和发布,完善出错设置 二.成员列表 姓名 学号列表 廖志 ...

  9. NSQ源码剖析——主要结构方法和消息生产消费过程

    目录 1 概述 2 主要结构体及方法 2.1 NSQD 2.2 tcpServer 2.3 protocolV2 2.4 clientV2 2.5 Topic 2.6 channel 3 启动过程 4 ...

  10. 创建dynamics CRM client-side (四) - Namespace Notation in JS

    我们在开发的时候会写很多functions. 但是这些functions 管理起来很麻烦. 微软内部建议我们使用namespace notation的形式管理我们的代码 // Converting f ...