通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__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的更多相关文章

  1. python特性--property

    在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的.那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值.那么,问题来 ...

  2. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property

    一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...

  3. python 中property函数如何实现

    实际上,在python中property(fget,fset,fdel,doc)函数不是一个真正的函数,他其实是拥有很多特殊方法的类. 这特殊类总的很多方法完成了property函数中的所有工作,涉及 ...

  4. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

  5. python's @property

    [python's @property] 参考:http://docs.python.org/3/library/functions.html?highlight=property#property

  6. python 中 property 属性的讲解及应用

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...

  7. python 特性:height-->while

    """ 出题:height 女生找对象 男生在1米-1.5米之间 小强你在哪里? 男生在1.5-1.7米之间 没有安全感 男生在1.7 - 1.8米之间 帅哥 留个电话 ...

  8. python的property属性

    最近看书中关于Python的property()内建函数属性内容时<python核心编程>解释的生僻难懂,但在网上看到了一篇关于property属性非常好的译文介绍. http://pyt ...

  9. python中@property装饰器的使用

    目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...

随机推荐

  1. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  2. java_Properties写入文件

    package ming; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.F ...

  3. Java Web services: WS-Security with Metro--referenc

    As you know from "Introducing Metro," the reference implementations of the JAXB 2.x data-b ...

  4. sql时间段算法

    需求:领导要求写时间段算法,格式如下 :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: :-: 一小时制 :-: :-: :-: ...

  5. Android Sutido 编译速度优化

    虽然Android Studio 此时已经更新到了Android Studio 2.1版本,build 版本android-studio-bundle-143.2739321.但是在安装该版本都是根据 ...

  6. Create RCU

    BI创建(数据)分析.仪表盘.报表前,都需要对数据进行建模,在oracle biee里称为创建“资料档案库”-该文件后缀为RPD,所以一般也称为创建RPD文件. 步骤: 1.从windows开始菜单里 ...

  7. 深入理解计算机系统第二版习题解答CSAPP 2.17

    假设w=4,我们能给每个可能的十六进制数字赋予一个数值,假设用一个无符号或者补码表示.完成下表: x 无符号(B2U(x)) 补码(B2T(x)) 十六进制 二进制 0xE 1110 14 -2 0x ...

  8. dl dd dt与ul li

    像这种格式的网页,可以用dl来实现,比较方便

  9. matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)

    函数功能:生成稀疏矩阵 使用方法 :S = sparse(A) 将矩阵A转化为稀疏矩阵形式,即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S.如果A本身是稀疏的,sparse(S)返回S. S ...

  10. (总结)CentOS Linux下VNC Server远程桌面配置详解

    一.安装相应桌面环境与vnc服务端和客户端: # yum groupinstall "GNOME Desktop Environment"(CentOS 5.x安装GNOME桌面环 ...