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对象中包含哪些属性,如成员函数.变量等,其中 ...
随机推荐
- 快乐python 零基础也能P图 —— PIL库
Python PIL PIL (Python Image Library) 库是Python 语言的一个第三方库,PIL库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.PIL库简介 1. ...
- linux sshd 登录不需要密码
ssh 安全外壳协议 协议22 linux 默认放行了 22 号接口 ssh 默认安装 自行安装 应该是 openssh-server ssh命令是 openssh ssh-keygen 生成密钥 生 ...
- Android程序backtrace分析方法
如何分析Android程序的backtrace 最近碰到Android apk crash的问题,单从log很难定位.从tombstone里面得到下面的backtrace. *** *** *** * ...
- GC调优
Gc调优的目标:1.降低停顿时间 2.提高吞吐量 3.避免full-gc 调优可以使用的手段:1.各个内存区的大小调整:堆,年轻代,老年代,方法区等等2.减少短暂对象的存活时间,提高长期对象的复用率( ...
- 转 Tomcat+redis+nginx配置
为客户开发的一个绩效系统,采用了java web的开发方式,使用了一些spring mvc, mybatis之类的框架.相比于oracle ebs的二次开发,这种开发更加灵活,虽然和ebs集成的时候遇 ...
- Node.js 开发指南
1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...
- 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理
我们常常遇到自己正规的网站链接,无端被微信拦截,大家都为这问题苦恼不已.但凡想使用微信来推广产品或者从事活动营销的用户,就一定会遇到域名被微信拦截甚至封停的情况.域名没被封过,那你的营销人生肯定是不完 ...
- Spring Boot 2 - 使用CommandLineRunner与ApplicationRunner
本篇文章我们将探讨CommandLineRunner和ApplicationRunner的使用. 在阅读本篇文章之前,你可以新建一个工程,写一些关于本篇内容代码,这样会加深你对本文内容的理解,关于如何 ...
- python jieba库的基本使用
第一步:先安装jieba库 输入命令:pip install jieba jieba库常用函数: jieba库分词的三种模式: 1.精准模式:把文本精准地分开,不存在冗余 2.全模式:把文中所有可能的 ...
- 如何阅读Java源码?
阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...