python对象属性管理(2):property管理属性
使用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管理属性的更多相关文章
- Python类(六)-静态方法、类方法、属性方法
静态方法 通过@staticmethod来定义,静态方法在类中,但在静态方法里访问不了类和实例中的属性,但静态方法需要类来调用 # -*- coding:utf-8 -*- __author__ = ...
- python --对象的属性
转自:http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html Python一切皆对象(object),每个对象都可能有多个属性(att ...
- Python学习第十六课——静态属性(property, classmethod, staticmethod)
计算所居住房子的面积 普通写法 class Room: def __init__(self,name,owner,width,length,heigh): self.name=name self.ow ...
- Python深入浅出property特性属性
导语 在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量. 而在Python中,因为有property这个 ...
- 深入理解python对象及属性
类属性和实例属性首先来看看类属性和类实例的属性在python中如何存储,通过__dir__方法来查看对象的属性 >>> class Test(object): pass>> ...
- 如何查看Python对象的属性
在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...
- python类内init外声明的属性与init内声明的对象属性的访问和操作区别
python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: ...
- Python property,属性
參考资料 http://www.ibm.com/developerworks/library/os-pythondescriptors/ 顾名思义,property用于生成一个属性.通过操作这个属性. ...
- 查看python对象的属性
在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...
随机推荐
- 为创世纪图书馆(Library Genesis)作镜像
简介 Library Genesis的Wikipedia条目中的介绍是: Library Genesis or LibGen is a search engine for articles and b ...
- js监听全屏下的esc事件
window.onresize = function() { if (!checkFull()) { //触发esc事件,执行业务逻辑. } }; function checkFull() { var ...
- 了解ip相关知识
最近一直扫盲,作为一个编程工作者,其实涉及的东西很广,但也一直没有深入一些网络的概念. 内内网IP局域网,网线都是连接在同一个 交换机上面的,也就是说它们的IP地址是由交换机或者路由器进行分配的.而且 ...
- TensorFlow学习笔记1
1.daocloud 拉取 docker镜像 docker pull daocloud.io/daocloud/tensorflow:latest 镜像位置: /Users/{YourUserName ...
- 更改了ssh文件下,还没有权限
执行 cd /root/.ssh chmod 600 id_*
- 转Centos7.0进入单用户模式修改root密码
Centos7.0进入单用户模式修改root密码 启动Centos7 ,按空格让其停留在如下界面. 按e进行编辑 在UTF-8后面输入init=/bin/sh 根据提示按ctrl+x 得如下图 输 ...
- 关于Android 8.0java.lang.SecurityException: Permission Denial错误的解决方法
背景 当我在Android 7.0及以下手机运行启动页,进行Activity跳转的时候,完美跳转到对应的目标Activity. 但当在Android 8.0及以上手机进行Activity跳转时,会爆如 ...
- mybatis 中的缓冲
package com.oaec.mybatis.test; import com.oaec.mybatis.dao.StudentDao;import com.oaec.mybatis.entity ...
- 设置npm的registry
.原npm地址 npm config set registry http://registry.npmjs.org .设置国内镜像 a.通过config命令 npm config set regist ...
- PMP:10.项目采购管理
内容中包含 base64string 图片造成字符过多,拒绝显示