使用Property管理属性

python提供了一种友好的getter、setter、deleter类方法的属性管理工具:property。

property()是一个内置函数,它返回一个Property对象,它的用法很简单,将getter、setter、deleter三个方法作为它的参数即可,这些参数都是可选的。

property_obj = property(getter,setter,deleter,doc)

通过这个Property对象可以智能地判断是getter操作、setter操作还是delete操作,见下面的示例。

唯一需要注意的是使用Property管理时,setter、deleter方法不要返回任何值,也就是说让它返回None(这是默认的),getter方法返回所取属性的值

例如,对于Person的name属性来说:

class Person:
def __init__(self, name, age):
self._name = name
self._age = age def set_name(self, name): self._name = name def get_name(self): return self._name def del_name(self): del self._name name = property(get_name, set_name, del_name) if __name__ == "__main__":
p1 = Person("malongshuai", 23) print(p1.name) # 自动调用get_name
p1.name = "malong" # 自动调用set_name
print(p1.name) # 自动调用get_name
del p1.name # 自动调用del_name
print(p1.name) # 自动调用get_name,将报错

注意上面property对象名为name,和对象属性"_name"是不同的,如果相同,则会出现无限递归问题

通过name这个property对象,就可以智能地判断是getter操作、setter操作还是deleter操作。

property结合装饰器也一样方便,这正是以前版本的python所常用的功能。

class Person:
def __init__(self, name, age):
self.name = name
self.age = age @property # 等价于 Name = property(Name)
def Name(self): return self.name @Name.setter # 等价于 Name = Name.setter(Name)
def Name(self, name): self.name = name @Name.deleter # 等价于 Name = Name.deleter(Name)
def Name(self): del self.name if __name__ == "__main__":
p1 = Person("malongshuai", 23) print(p1.Name) # 自动调用get_name
p1.Name = "malong" # 自动调用set_name
print(p1.Name) # 自动调用get_name
del p1.Name # 自动调用del_name

至于选择使用装饰器结合Property还是直接使用property的内置函数,自行选择,并没有什么区别。

通过Property,还可以返回计算后的值。

class A():
def __init__(self, value):
self.value = value def two_time(self, value):
self.value = self.value * 2 def get_value(self):
return self.value Value = property(get_value, two_time) if __name__ == "__main__":
a = A(23)
print(a.Value)
a.Value = 33
print(a.Value)

Property对象的属性

先看看Property的定义:

class property(object)
| property(fget=None, fset=None, fdel=None, doc=None)
|
| Property attribute.
|
| fget
| function to be used for getting an attribute value
| fset
| function to be used for setting an attribute value
| fdel
| function to be used for del'ing an attribute
| doc
| docstring

这些无需解释。

再看下property的属性:

>>> property.__dict__.keys()
dict_keys(['__getattribute__', '__get__', '__set__', '__delete__', '__init__', '__new__', 'getter', 'setter', 'deleter', 'fget', 'fset', 'fdel', '__doc__', '__isabstractmethod__'])

关注一下它的getter、setter、deleter方法,在前面property结合装饰器的示例中已经使用到了这几个函数。:

deleter(...)
Descriptor to change the deleter on a property. getter(...)
Descriptor to change the getter on a property. setter(...)
Descriptor to change the setter on a property.

看方法的文档说明是设置Property对象上的getter、setter、deleter方法,这句话结合前面的"property+装饰器"的示例很容易理解和使用。

python对象属性管理(2):property管理属性的更多相关文章

  1. Python类(六)-静态方法、类方法、属性方法

    静态方法 通过@staticmethod来定义,静态方法在类中,但在静态方法里访问不了类和实例中的属性,但静态方法需要类来调用 # -*- coding:utf-8 -*- __author__ = ...

  2. python --对象的属性

    转自:http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html Python一切皆对象(object),每个对象都可能有多个属性(att ...

  3. Python学习第十六课——静态属性(property, classmethod, staticmethod)

    计算所居住房子的面积 普通写法 class Room: def __init__(self,name,owner,width,length,heigh): self.name=name self.ow ...

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

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

  5. 深入理解python对象及属性

    类属性和实例属性首先来看看类属性和类实例的属性在python中如何存储,通过__dir__方法来查看对象的属性 >>> class Test(object): pass>> ...

  6. 如何查看Python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...

  7. python类内init外声明的属性与init内声明的对象属性的访问和操作区别

    python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: ...

  8. Python property,属性

    參考资料 http://www.ibm.com/developerworks/library/os-pythondescriptors/ 顾名思义,property用于生成一个属性.通过操作这个属性. ...

  9. 查看python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...

随机推荐

  1. Python开发——11.异常及异常处理

    一.异常 1.定义 异常及时程序运行时发生错误的信号 2.种类 异常分为语法错误和逻辑错误,语法错误在程序执行之前就应该改正. 常用异常 AttributeError 试图访问一个对象没有的树形,比如 ...

  2. Docker优势以及与传统虚拟机对比(1)

    docker优势 1.更快速地交付和部署: 2.更高的虚拟化(不需要额外的hypervisor支持,是内核级的虚拟化,实现更高的性能呢和效率): 3.更轻松的迁移和扩展: 4.更简单的管理  与传统的 ...

  3. APIView源码简单分析图

    APIView源码简单分析 !声明:下面这个dispatch分发方法不在是父类View里的dispatch了,APIView重新封装了这个dispatch.(整个核心就是initialize_requ ...

  4. Linux编程之fork函数

    在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi ...

  5. FPGA中带优先级的if else if与不带优先级的case的探讨

    我们知道在书本上都说让我们尽量使用不带优先级的的数据选择器,今天我们就来探讨一下二者的区别. 例子1:带优先级的的数据选择器,综合成功,且没有任何警告. module detection_prio # ...

  6. 快速制作U盘启动盘和U盘安装盘的方法

    制作U盘启动盘的方法: 1. 安装UltraISO; 2. 安装完成后,用管理员权限打开UltraISO; 3. 打开启动盘文件,一般为ISO文件: 4. 插入U盘: 5. 选择 启动 -> 写 ...

  7. 删除坏掉的 Active Directory Domain

    最近公司的某个 Domain Controller 报告可能由于长时间没在线,同步失败,然后用 Repldiag 工具清理 lingering objects 的过程中,该工具报告存在 serious ...

  8. 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组

    [源码下载] 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组 作者:webabcd 介绍背水一 ...

  9. IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?

    1.前言 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交换异步化等等角色,当然MQ消息中间件的作用远不止于 ...

  10. 继承user表需要配置

    AUTH_USER_MODEL = 'users.User'   (应用名.模型类名)