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对象中包含哪些属性,如成员函数.变量等,其中 ...
随机推荐
- PopupWindow计算弹出位置
1.首先自定义PopupWindow popWindowView= LinearLayout.inflate(context, R.layout.popupWindow,null); po ...
- MATLAB2016a安装破解教程
首先,下载软件:下面是某博主的分享,可以下载软件. 链接:https://pan.baidu.com/s/1i6BgD8p 密码:17gg 第一步:安装软件 1,下载文件,得到R2016 ...
- 逆向基本使用:IDA
如何导出IDA数据中数组的内容进行编程? 如这种: .data:00427A54 ; char byte_427A54[] .data:00427A54 byte_427A54 db 0FEh ; D ...
- 《Node.js高级编程》之Node 核心API基础
Node 核心API基础 第三章 加载模块 第四章 应用缓冲区 第五章 事件发射器模式简化事件绑定 第六章 使用定时器制定函数执行计划 第三章 加载模块 本章提要 加载模块 创建模块 使用node_m ...
- 【BZOJ4883】 [Lydsy1705月赛]棋盘上的守卫(最小生成树,基环树)
传送门 BZOJ Solution 考虑一下如果把行,列当成点,那么显然这个东西就是一个基环树对吧. 直接按照\(Kruscal\)那样子搞就好了. 代码实现 代码戳这里
- Cobaltstrike、armitage联动
i 春秋作家:fengzi 原文来自:Cobaltstrike.armitage联动 在使用Cobaltstrike的时候发现他在大型或者比较复杂的内网环境中,作为内网拓展以及红队工具使用时拓展能力有 ...
- rem计算
//jquery实现 // $(function(){ // $(window).on("resize",function(){ // var width=$(window).wi ...
- IP达人启示录
在家附近的一个小公园中,一个老人每天晚上都在用水练习书法,他的字写的的确很不错,不懂书法的我,看了就感觉非常的带劲--苍劲有力.今晚再次路过的时候,就有种想和这个老人聊一聊的冲动,那么多年纪了,用书法 ...
- Spring中Model、ModelMap及ModelAndView之间的区别+传递参数
org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...
- LockSupport浅析
最初想有没有必要写这类文章,网上相关的文章很多,有些更为透彻,自己再写一篇不免有重复造轮子的感觉. 但想想写文除了分享知识外也可以帮助自己总结归纳,也稍稍可以提高点自我满足感. 基本的线程阻塞原语,被 ...