參考资料

http://www.ibm.com/developerworks/library/os-pythondescriptors/

顾名思义,property用于生成一个属性。通过操作这个属性。能够映射为对某些函数的操作,类似于C#。

形式为

pvar = propery(get_func, set_func, del_fun, doc_func);

在get。set,del,doc的时候分别调用对应的函数;

尝试这样定义

>>> aa = property(lambda: "hello", lambda x: print(x))

>>> aa

<property object at 0x7fdcd9ecf9a8>

>>> aa = 1

看来property仅仅有在class中才有意义(看后文)

>>> class Test:

... aa = property(lambda self: "hello", lambda
self,x: print(x))

...

>>> t = Test()

>>> t.aa

'hello'

>>> t.aa = (1,2,2)

(1, 2, 2)

property的神奇面纱

事实上propery并非一个真正的函数,而是一个类

>>> type(property)

<class 'type'>

而普通的函数为

>>> def f():

... pass

...

>>> type(f)

<class 'function'>

property类实现了__get__, __set__, __delete__方法,这3个方法合在一起,就定义了描写叙述符规则,实现了当中不论什么一个方法的对象就叫描写叙述符(descriptor)。描写叙述符的特殊之处在于它使怎样被訪问的。比方,程序读取一个属性时。假设该属性被绑定到实现了__get__方法的对象上。那么就会调用__get__方法(返回其结果),而不是简单的返回该对象。

class Something:

... def __get__(self, instance, owner):

... print(instance)

... print(owner)

... return "__get__"

... def __set__(self, instance, name):

... print(instance)

... print(name)

... print("__set__")

>>> class Holder:

... s = Something()

...

>>> h = Holder()

>>> h.s

<__main__.Holder object at 0x7fdcd9ed8518>

<class '__main__.Holder'>

'__get__'

>>> h.s = 3

<__main__.Holder object at 0x7fdcd9ed8518>

__set__

Something的__get__ 和 __set__方法的參数instance,相应了Something对象所所绑定的对象;能够想象。Property是通过instance调用传入当中的get, set, del, doc

须要注意的是:描写叙述符必须被赋值给类属性,而不是对象实例属性,才有效

>>> class Something:

... pass

>>> setattr(Something, 'aa', property(lambda self: "hello", lambda self, x: print(x)))

>>> t.aa

'hello'

>>> t.aa = 3

而设置在对象实例上,则无效果:

>>> setattr(t, 'aa', property(lambda self: "hello", lambda self, x: print(x)))

>>> setattr(Something, 'aa', None)

>>> t.aa

<property object at 0x7fdcd9edf4f8>

>>> t.aa = 3

另外,还能够通过注解(Annotation)的方式定义property

class C(object):

| @property

| def x(self):

| "I am the 'x' property."

| return self._x

| @x.setter

| def x(self, value):

| self._x = value

| @x.deleter

| def x(self):

| del self._x

http://www.ibm.com/developerworks/library/os-pythondescriptors/给了一种动态创建Property的方法

class Person(object):

def addProperty(self, attribute):

# create local setter and getter with a particular attribute name

getter = lambda self: self._getProperty(attribute)

setter = lambda self, value: self._setProperty(attribute, value)

# construct property attribute and add it to the class

setattr(self.__class__, attribute, property(fget=getter, \

fset=setter, \

doc="Auto-generated method"))

def _setProperty(self, attribute, value):

print "Setting: %s = %s" %(attribute, value)

setattr(self, '_' + attribute, value.title())

def _getProperty(self, attribute):

print "Getting: %s" %attribute

return getattr(self, '_' + attribute)

Python property,属性的更多相关文章

  1. python - property 属性函数

    Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只读属性 重新实现一个属性的setter和getter ...

  2. Python——@property属性描述符

    @property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 假设定义了一个类Cls,该类必须继承自object类,有一私 ...

  3. python @property 属性

    在绑定属性时,如果我们直接把属性暴露出去,显然不合适,是通过getter和setter方法来实现的,还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性: class P ...

  4. python property属性

    能够检查參数,一直没注意这个语言特性,忽略了非常多细节,感谢 vitrox class Person( object ): def __init__( self, name ): if not isi ...

  5. 网络编程-Python高级语法-property属性

    知识点: 一.什么是property属性? 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最 ...

  6. python中的property属性

    目录 1. 什么是property属性 2. 简单的实例 3. property属性的有两种方式 3.1 装饰器方式 3.2 类属性方式,创建值为property对象的类属性 4. property属 ...

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

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

  8. python的property属性

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

  9. 【转】python之property属性

    1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ############### class Foo: def ...

  10. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

随机推荐

  1. setRequestedOrientation

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//通过程序改变屏幕显示的方向 1.landscape:横屏(风景 ...

  2. python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

    1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...

  3. Kafka: Producer (0.10.0.0)

    转自:http://www.cnblogs.com/f1194361820/p/6048429.html 通过前面的架构简述,知道了Producer是用来产生消息记录,并将消息以异步的方式发送给指定的 ...

  4. 【Python】微博自动抢红包

    # -*- coding: utf-8 -*- import requests import js2xml from lxml import etree headers = { # 这边cookie替 ...

  5. 设计模式之单一职责原则(iOS开发,代码用Objective-C展示)

    单一职责原则:就一个类而言,应该只有一个引起它变化的原因. 在iOS开发中,我们会很自然的给一个类添加各种各样的功能,比如随便写一个简单的应用程序,一般都会生成一个viewController类,于是 ...

  6. 常用Git命令清单(转)

    文/阮一峰 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图 6 个命令,就可以了.但是熟练使用,恐怕要记住 60-100 个命令. 下面是我整理的常用 Git 命令清单.几 ...

  7. mariadb是替代MySQL的好方式

    像Oracle这样成熟稳定的数据库,足以支撑海量数据的存储与查询了?为什么还需要数据切片呢?的确,Oracle的DB确实很成熟很稳定,但是高昂的使用费用和高端的硬件支撑不是每一个公司能支付的起的.试想 ...

  8. 【WPF】帐号系统中,用户注册的校验逻辑(正则表达式)

    帐号系统中,用户注册时,在向服务器发送校验请求之前,客户端会先进行用户填写内容的校验(主要靠正则表达式). 由于校验注册的逻辑在多个项目中可以重用,这类通用的代码最好记录下来. 界面内容大致如下.现在 ...

  9. Netty4.x中文教程系列(二) Hello World !<转>

    在中国程序界.我们都是学着Hello World !慢慢成长起来的.逐渐从一无所知到熟悉精通的. 第二章就从Hello World 开始讲述Netty的中文教程. 首先创建一个Java项目.引入一个N ...

  10. SD卡镜像烧写--树莓派为例

    SD烧写镜像都要先擦除SD卡内容,然后用image烧写工具烧写镜像. SD卡标准官网:www.sdcard.org,提供标准的擦除工具sdformatter. windows下镜像烧写工具可选用Win ...