`
joy2everyone
  • 浏览: 136291 次
  • 性别: 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  
写的很好。

相关推荐

    python学习笔记说明的PPT

    ### Python学习笔记说明的PPT知识点详述 #### 一、Python简介 - **Python的特点**: - **优雅**:简洁清晰的语法结构。 - **明确**:避免使用隐晦的方式解决问题。 - **简单**:尽可能简化语言结构。 - **...

    Python学习笔记.pdf

    Python学习笔记中的知识点涵盖了Python编程语言的基础概念和结构。由于文件内容较为复杂且存在OCR识别错误,我们将尝试将内容按可理解的结构和顺序组织并解释这些关键概念。 1. Python基础数据类型:笔记中提及了...

    python学习笔记-面向对象高级编程-20200324

    文章目录面向对象高级编程使用__slots__使用__slots__使用@property练习多重继承Mixln小结定制类__str____iter____getitem____getattr____call__小结使用枚举类exercise小结使用元类type()metaclass 面向对象高级...

    Python学习笔记.docx

    总的来说,理解Python中的类、对象、方法绑定、内置函数以及魔法方法是深入学习Python编程的关键。这些概念构成了Python面向对象编程的基础,并允许开发者创建复杂的、自定义的数据结构和行为。通过熟练掌握这些知识...

    ann77 python

    ### ann77 Python - 王纯业的Python学习笔记 #### 知识点概述 1. **Python简介** - Python的历史和发展。 - Python的特点与优势。 - Python的应用领域。 2. **基本数据类型** - 整型(integer):介绍整型...

    记录学习:流畅的Python 一书的过程,并整理成代码和笔记.zip

    这个压缩包包含了读者kwan1117在学习本书时所做的代码示例和笔记,以下将对其中可能涵盖的一些关键知识点进行详细的解释。 1. **Python的数据结构**: - 列表推导式:这是一种简洁的创建列表的方式,如 `[x for x ...

    python-cookbook:Jupyter笔记本中的《 Python Cookbook》中的代码

    - 使用内置函数和C扩展:Python的内置函数通常比自定义函数更快,学习识别并利用这些优化点。 9. **错误检查与调试**: - 错误处理:掌握如何优雅地处理程序运行时的错误,避免程序崩溃。 - 调试技巧:学习使用...

    python59条代码编辑建议读书笔记

    《Effective Python:编写高质量Python代码的59个有效方法》是Brett Slatkin所著的一本关于Python编程实践的书籍。这本书通过59条具体的...通过学习并应用这些建议,开发者可以写出更加高效、易于维护的Python代码。

    Python知识点.doc

    这篇学习笔记主要涵盖了Python的基础知识和爬虫入门部分,以下是其中的关键知识点详解: 一、Python基础 1. 属性私有化问题:在Python中,通过在变量名前加两个下划线`__`来实现属性的私有化,这样可以防止外部...

    Robot Framework 源代码阅读笔记 之 一 - CSDN博客

    总之,本文作为Robot Framework源代码阅读笔记的一部分,作者不仅分享了对Robot Framework的了解,还整理了众多与Python测试相关的库和工具,为我们展示了丰富的测试工具生态,为测试开发人员提供了宝贵的学习和参考...

    Python基础第九章

    本篇笔记主要涉及Python的基础知识,特别是面向对象编程的概念,包括对象、类、实例、属性等核心概念。 面向对象编程(Object-Oriented Programming,OOP)是Python中的重要编程范式。它通过将数据和操作数据的方法...

    带标签_超详细笔记以及拓展延伸知识点总结_小甲鱼零基础入门学习python系列教程

    笔记_小甲鱼零基础入门学习python系列教程 1 目录 2 序 4 01讲:我和Python的第一次亲密接触 7 02讲:用Python设计第一个游戏 9 03讲:小插曲之变量和字符串 11 04讲:改进我们的小游戏 13 05讲:闲聊之Python的数据...

    学习笔记(20):21天通关Python(仅视频课)-多异常捕捉和异常处理嵌套及引发异常…

    立即学习:... @property def theAge(self): return self.__age @theAge.setter def theAge(self, age): if age &gt; 30 or age &lt; 10: # raise #默认RuntimeError # raiseVal

    opencv学习笔记

    这篇学习笔记主要介绍了如何在Windows环境下,利用Visual Studio 2013配置OpenCV 2.4.8版本。 首先,OpenCV的安装通常涉及下载官方发布的SDK,这里提到的是OpenCV 2.4.8版本,适用于Windows平台。下载完成后,会...

    数字IC验证学习笔记,关于SVA,Function coverage,UVM特性

    ### 数字IC验证学习笔记——SVA、Function Coverage与UVM特性详解 #### 一、SystemVerilog断言(SVA) **SVA**(SystemVerilog Assertions)是一种用于硬件验证的语言扩展,它允许用户在RTL级代码中编写断言来检查...

    初学者python笔记(类的装饰器、property方法、元类)

    本篇是面向对象编程的进阶知识,内容稍微有点抽象,但是每处都标足了注释和运行结果,可以参考着学习。内容主要涉及上下文协议管理、类的装饰器使用、property方法、元类四个方面 上下文协议管理 就是with … as …...

    selenium学习笔记

    它支持多种浏览器,如Chrome、Firefox、Internet Explorer等,并且有多种编程语言接口,包括Java、Python、C#等。 在Java中使用Selenium,首先需要下载对应的浏览器驱动,例如对于IE浏览器,你需要下载`...

Global site tag (gtag.js) - Google Analytics