`
joy2everyone
  • 浏览: 134751 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

python学习笔记 - @property

阅读更多
@property 可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的,我们视具体情况吧

请注意以下代码场景:

代码片段1:
class Parrot(object):
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

if __name__ == "__main__":
    # instance
    p = Parrot()
    # similarly invoke "getter" via @property
    print p.voltage
    # update, similarly invoke "setter"
    p.voltage = 12


代码片段2:
class Parrot:
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

if __name__ == "__main__":
    # instance
    p = Parrot()
    # similarly invoke "getter" via @property
    print p.voltage
    # update, similarly invoke "setter"
    p.voltage = 12


代码1、2的区别在于
class Parrot(object):

在python2.6下,分别运行测试
片段1:将会提示一个预期的错误信息 AttributeError: can't set attribute
片段2:正确运行

参考python2.6文档,@property将提供一个ready-only property,以上代码没有提供对应的@voltage.setter,按理说片段2代码将提示运行错误,在python2.6文档中,我们可以找到以下信息:

BIF:
property([fget[, fset[, fdel[, doc]]]])
Return a property attribute for new-style classes (classes that derive from object).
原来在python2.6下,内置类型 object 并不是默认的基类,如果在定义类时,没有明确说明的话(代码片段2),我们定义的Parrot(代码片段2)将不会继承object

而object类正好提供了我们需要的@property功能,在文档中我们可以查到如下信息:

new-style class
Any class which inherits from object. This includes all built-in types like list and dict. Only new-style classes can use Python's newer, versatile features like __slots__, descriptors, properties, and __getattribute__().

同时我们也可以通过以下方法来验证
class A:
	pass

>>type(A)
<type 'classobj'>
class A(object):
	pass

>>type(A)
<type 'type'>

从返回的<type 'classobj'>,<type 'type'>可以看出<type 'type'>是我们需要的object类型(python 3.0 将object类作为默认基类,所以都将返回<type 'type'>)

为了考虑代码的python 版本过渡期的兼容性问题,我觉得应该定义class文件的时候,都应该显式定义object,做为一个好习惯

最后的代码将如下:
class Parrot(object):
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

    @voltage.setter
    def voltage(self, new_value):
        self._voltage = new_value

if __name__ == "__main__":
    # instance
    p = Parrot()
    # similarly invoke "getter" via @property
    print p.voltage
    # update, similarly invoke "setter"
    p.voltage = 12


另外,@property是在2.6、3.0新增的,2.5没有该功能。

以上为自己@property经历,我也在学习python中,目前使用的是python 2.6.6 final,很多东西不懂,在此笔记下,也希望对其他同学有帮助

Good luck!

分享到:
评论
12 楼 奶油花生 2013-06-09  
joy2everyone 写道
fanfq 写道
ps.你推荐的那个ide很好用,上手很快。


:)

请问什么ide好用啊。求
11 楼 freecode 2012-02-10  
学习了,增加使用经验
10 楼 joy2everyone 2011-11-09  
newlifewant 写道
nice!

谢谢
9 楼 newlifewant 2011-11-07  
nice!
8 楼 joy2everyone 2011-04-05  
fanfq 写道
有点疑惑,昨天开始正式学习python,
python有垃圾回收机制,我看别人的类里面都自己手写的 __del__(self)这个方法。我的理解是c++的析构函数,你能解释一下么?呵呵


今天才看到关于析构函数的定义介绍,你的理解是对的,__del__是用于垃圾回收机制,但是发生调用的具体时间是不可知的,如果可以的话,我们应该尽力避免使用。
7 楼 joy2everyone 2011-03-23  
fanfq 写道
有点疑惑,昨天开始正式学习python,
python有垃圾回收机制,我看别人的类里面都自己手写的 __del__(self)这个方法。我的理解是c++的析构函数,你能解释一下么?呵呵



我没有学习过c++,所以不懂析构函数,见谅啦
6 楼 joy2everyone 2011-03-23  
fanfq 写道
ps.你推荐的那个ide很好用,上手很快。


:)
5 楼 joy2everyone 2011-03-23  
fanfq 写道
有点疑惑,昨天开始正式学习python,
python有垃圾回收机制,我看别人的类里面都自己手写的 __del__(self)这个方法。我的理解是c++的析构函数,你能解释一下么?呵呵



__del__ 方法可以作为一种“确保”手段,保证你预期的资源被释放,当该实例引用为None的时候

class Test(object):

	def __del__(self):
		print "del"
		self.close()

	def close(self):
		print "close your expected app resource"


>>t = Test()
>>t = None
del
close your expected app resource

垃圾回收机制,实际的内存、资源释放都是交给编程语言本身,在“特定”情况下才执行,通过__del__可以简单理解为一种“确保”途径。

我也才学习python没多久,以上是自己很浅显的理解,多看下object.__del__(self)的文档说明

希望对你有帮助
4 楼 fanfq 2011-03-23  
ps.你推荐的那个ide很好用,上手很快。
3 楼 fanfq 2011-03-23  
有点疑惑,昨天开始正式学习python,
python有垃圾回收机制,我看别人的类里面都自己手写的 __del__(self)这个方法。我的理解是c++的析构函数,你能解释一下么?呵呵
2 楼 joy2everyone 2011-02-28  
binoruv 写道
写的很好。


呵呵,一起学习一起分享
1 楼 binoruv 2011-02-28  
写的很好。

相关推荐

Global site tag (gtag.js) - Google Analytics