python特性property
通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道。若果要规范这些访问和设值方式的话,
一种方法是数据描述符,另一种就是python内置的数据描述符协议函数Property()。property是一种特殊的值,访问它时会计算它的值。
特性的原型函数是property(getf=None,setf=None,delf=None,doc=None),函数的前三个参数分别对应描述符的__get__、__set__、__delete__方法。
class Foo(object):
def __init__(self,name):
self._name=name
def getname(self):
return self._name
def setname(self,value):
self._name=value
def delname(self):
del self._name
name=property(getname,setname,delname)
这样就可以对属性进行读取、设置和删除了:
>>> f=Foo('hello')
>>> f.name
'hello'
>>> f.name='world'
>>> f.name
'world'
>>> del f.name
>>> f.name
AttributeError: 'Foo' object has no attribute '_name'
python2.6新增加了一个property装饰器,写起来更加的优雅。
class Foo(object):
def __init__(self,name):
self._name=name
@property
def name(self):
return self._name
@name.setter
def name(self,value):
self._name=value
@name.deleter
def name(self):
del self._name
首先使用@property装饰器和相关方法将属性name设置为可读,后面的@name.setter和@name.deleter装饰器将其他方法与name属性上的设置和
删除操作相关联。实际的name值存储在属性_name中。实际存储属性的名称无需遵循任何约定,只需要与特性名称不同即可。
特性的使用遵循统一访问原则。如果没有特性,将会以简单属性的形式访问属性,而其他属性将以方法的形式访问。费力去了解何时添加额外的()会带来不必要的混淆。
实际上,方法本身是作为一类特性被隐式处理的。
class Foo(object):
def __init__(self,name):
self.name=name
def spam(self,x):
print '%s.%s'%(self.name,x)
用户创建f=Foo('hello')这样的实例然后访问f.spam时,不会返回原始函数对象spam,相反会得到绑定方法。绑定方法有点类似于部分计算的函数,
其中的self参数已经填入,但其他参数仍然需要在使用()调用该函数时提供。这种绑定方法是由在后台执行的特性函数静静地创建的。使用@staticmethod和
@classmethod定义静态方法和类方法时,实际上就指定了使用不同的特性函数,以不同的方式处理对这些方法的访问。
python特性property的更多相关文章
- python特性--property
在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的.那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值.那么,问题来 ...
- python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property
一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...
- python 中property函数如何实现
实际上,在python中property(fget,fset,fdel,doc)函数不是一个真正的函数,他其实是拥有很多特殊方法的类. 这特殊类总的很多方法完成了property函数中的所有工作,涉及 ...
- Python的property装饰器的基本用法
Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...
- python's @property
[python's @property] 参考:http://docs.python.org/3/library/functions.html?highlight=property#property
- python 中 property 属性的讲解及应用
Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...
- python 特性:height-->while
""" 出题:height 女生找对象 男生在1米-1.5米之间 小强你在哪里? 男生在1.5-1.7米之间 没有安全感 男生在1.7 - 1.8米之间 帅哥 留个电话 ...
- python的property属性
最近看书中关于Python的property()内建函数属性内容时<python核心编程>解释的生僻难懂,但在网上看到了一篇关于property属性非常好的译文介绍. http://pyt ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
随机推荐
- 在CentOS上编译安装PostgreSQL
http://my.oschina.net/tashi/blog 第一步:准备阶段 获取必需软件包: CentOS中查看是否安装了某个软件的命令:rpm -qa | grep 软件名.which命令可 ...
- [Effective C++ --010]令赋值操作符返回一个reference to *this
差不多最经典的就是这个了: x = y = z = ; 解读为: x = (y = ( z = )); 如果没有返回值,上述代码就不能通过编译. 其实看到标题就差不多明白这一条了,但是为什么连续赋值时 ...
- Html简单demo_html列表中进行编辑操作
html列表中进行编辑操作 <div class="_sort_box" style="float: left;"><?php echo $v ...
- ajax的一部分知识
jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...
- jsp HTTP Status 405 - HTTP method GET is not supported by this URL
package myservlet.control; import java.io.IOException; import java.io.PrintWriter; import javax.serv ...
- Android学习之Activity初步
Activity作为Android的第一步接触的概念,在学习中将初步的认识总结下来,以便后续的回顾与反思. 1.在用Android Studio生成第一个helloworld应用程序运行在手机上时,发 ...
- Lucene全文检索系列(一)
1. Lucene简介 Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎.Lucene以其方便使用.快速实施以及灵活性受到广泛的关注.它可以方便地嵌入到各种应用中实现针对应用的全文 ...
- 关于JFace中的右键菜单Action类,ActgionGroup类,MenuManager类
Action类,ActionGroup类,MenuManager类介绍 SWT中菜单是Menu类,在前面章节中已经介绍过Menu类的使用. 菜单项用MeauItem类来实现.但是在实际开发中,同一种功 ...
- 关于Http协议的解析
HTTP概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...
- EditPlus自动补全、模板配置
EditPlus真的是一款非常好用的编辑器,虽然小,但是短小精悍,速度快.只要配置好了,功能也是很强大的.下面来总结一下如何配置EditPlus的自动补全,和模板配置. 一.配置自动补全:(以开发CS ...