原创 python中property函数

2010-7-27 15:49 5965 3 3 分类: 工程师职场

对python中property函数的理解

下载了python-twitter-0.5的代码,想学习一下别人是如何用python来开发一个开源项目的,发现确实没找错东西,首先代码量少,一共才一个45k的源文件,原文件太多,看上去就有点头疼,而且主要目的不是研究twitter api的实现。
该项目里面包含了以下内容:
1. 使用setup.py来build和setup
2. 包含了testcase的代码,通过执行命令来完成单元测试
3. 代码结构清晰,文档写得很好
4. 使用pydoc来制作文档。
5. 包含api基本的使用方法。

今天主要是简单阅读了一下python-twitter的代码,发现以前没有接触过的property函数,参见如下代码:

classdef__init__==========defreturndef SetCreatedAt(self, created_at):
    self._created_at == property(GetCreatedAt, SetCreatedAt,
                        doc='The time this status message was posted.'

                        
其中,对于类成员created_at就使用了property函数,翻看了python 2.5 document里面对于property函数的解释:

2.1 Built-in Functions 
property( [fget[, fset[, fdel[, doc]]]])

Return a property attribute for new-style classes (classes that derive from object). 
fget is a function for getting an attribute value, likewise fset is a function for setting, and fdel a function for del'ing, an attribute. Typical use is to define a managed attribute x:

classdef__init__(self): self._x =def getx(self): returndef setx(self, value): self._x =def delx(self): del= property(getx, setx, delx, "I'm the 'x' property.")

If given, doc will be the docstring of the property attribute. Otherwise, the property will copy fget's docstring (if it exists). This makes it possible to create read-only properties easily using property() as a decorator:

大概含义是,如果要使用property函数,首先定义class的时候必须是object的子类。通过property的定义,当获取成员x的值时,就会调用getx函数,当给成员x赋值时,就会调用setx函数,当删除x时,就会调用delx函数。使用属性的好处就是因为在调用函数,可以做一些检查。如果没有严格的要求,直接使用实例属性可能更方便。

同时,还可以通过指定doc的值来为类成员定义docstring。 

class C(object):
    
def __init__(self): self._x = None
    
def getx(self): print "get x";return self._x
    
def setx(self, value): print "set x"; self._x = value
    
def delx(self): print "del x";del self._x
    x 
= property(getx, setx, delx, "I'm the 'x' property.")

使用 
>>> t=C()
>>> t.x
get x
>>> t.x="en"
set x
>>> print t.x
get x
en
>>> del t.x
del x
>>> t.x
get x




大家也许知道C#中提供了属性Property这个概念,让我们在对私有成员赋值、获取时更加方便,而不用像C++分别定义set*和get*两个函数,在使用时也就像直接使用变量一样。
  今天突然发现Python中竟然也提供了如此类似的方法,感到甚为亲切,发上来大家一起讨论一下,有不妥的地方还请多多指教。
  假设定义了一个类:C,该类必须继承自object类,有一私有变量_x
class C:
 def __init__(self):
  self.__x=None
  1.现在介绍第一种使用属性的方法:
  在该类中定义三个函数,分别用作赋值、取值和删除变量(此处表达也许不很清晰,请看示例)
 def getx(self):
  return self.__x
 def setx(self,value):
  self.__x=value
 def delx(self):
  del self.__x
  在类中在增加一条语句:x=property(getx,setx,delx,''),property函数原型为property(fget=None,fset=None,fdel=None,doc=None),所以根据自己需要定义相应的函数即可。
  现在这个类中的x属性便已经定义好了,我们可以先定义一个C的实例c=C(),然后赋值c.x=100,取值y=c.x,删除:del c.x。是不是很简单呢?请看第二种方法
  2.下面看第二种方法(在2.6中新增)
  首先定义一个类C:
class C:
 def __init__(self):
  self.__x=None
  下面就开始定义属性了
 @property
 def x(self):
  return self.__x
 @x.setter
 def x(self,value):
  self.__x=value
 @x.deleter
 def x(self):
  del self.__x
  到此为止就可以像上面一样使用x属性了。。如果打算设为只读或者只写属性,那就定义一个函数吧,不过同一属性的三个函数名要相同哦。。
  试试吧。。。
  不知道代码贴上来是啥效果,但愿不会太乱。。。



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条