@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!
分享到:
相关推荐
### Python学习笔记说明的PPT知识点详述 #### 一、Python简介 - **Python的特点**: - **优雅**:简洁清晰的语法结构。 - **明确**:避免使用隐晦的方式解决问题。 - **简单**:尽可能简化语言结构。 - **...
Python学习笔记中的知识点涵盖了Python编程语言的基础概念和结构。由于文件内容较为复杂且存在OCR识别错误,我们将尝试将内容按可理解的结构和顺序组织并解释这些关键概念。 1. Python基础数据类型:笔记中提及了...
文章目录面向对象高级编程使用__slots__使用__slots__使用@property练习多重继承Mixln小结定制类__str____iter____getitem____getattr____call__小结使用枚举类exercise小结使用元类type()metaclass 面向对象高级...
总的来说,理解Python中的类、对象、方法绑定、内置函数以及魔法方法是深入学习Python编程的关键。这些概念构成了Python面向对象编程的基础,并允许开发者创建复杂的、自定义的数据结构和行为。通过熟练掌握这些知识...
### ann77 Python - 王纯业的Python学习笔记 #### 知识点概述 1. **Python简介** - Python的历史和发展。 - Python的特点与优势。 - Python的应用领域。 2. **基本数据类型** - 整型(integer):介绍整型...
这个压缩包包含了读者kwan1117在学习本书时所做的代码示例和笔记,以下将对其中可能涵盖的一些关键知识点进行详细的解释。 1. **Python的数据结构**: - 列表推导式:这是一种简洁的创建列表的方式,如 `[x for x ...
- 使用内置函数和C扩展:Python的内置函数通常比自定义函数更快,学习识别并利用这些优化点。 9. **错误检查与调试**: - 错误处理:掌握如何优雅地处理程序运行时的错误,避免程序崩溃。 - 调试技巧:学习使用...
《Effective Python:编写高质量Python代码的59个有效方法》是Brett Slatkin所著的一本关于Python编程实践的书籍。这本书通过59条具体的...通过学习并应用这些建议,开发者可以写出更加高效、易于维护的Python代码。
这篇学习笔记主要涵盖了Python的基础知识和爬虫入门部分,以下是其中的关键知识点详解: 一、Python基础 1. 属性私有化问题:在Python中,通过在变量名前加两个下划线`__`来实现属性的私有化,这样可以防止外部...
总之,本文作为Robot Framework源代码阅读笔记的一部分,作者不仅分享了对Robot Framework的了解,还整理了众多与Python测试相关的库和工具,为我们展示了丰富的测试工具生态,为测试开发人员提供了宝贵的学习和参考...
本篇笔记主要涉及Python的基础知识,特别是面向对象编程的概念,包括对象、类、实例、属性等核心概念。 面向对象编程(Object-Oriented Programming,OOP)是Python中的重要编程范式。它通过将数据和操作数据的方法...
笔记_小甲鱼零基础入门学习python系列教程 1 目录 2 序 4 01讲:我和Python的第一次亲密接触 7 02讲:用Python设计第一个游戏 9 03讲:小插曲之变量和字符串 11 04讲:改进我们的小游戏 13 05讲:闲聊之Python的数据...
立即学习:... @property def theAge(self): return self.__age @theAge.setter def theAge(self, age): if age > 30 or age < 10: # raise #默认RuntimeError # raiseVal
这篇学习笔记主要介绍了如何在Windows环境下,利用Visual Studio 2013配置OpenCV 2.4.8版本。 首先,OpenCV的安装通常涉及下载官方发布的SDK,这里提到的是OpenCV 2.4.8版本,适用于Windows平台。下载完成后,会...
### 数字IC验证学习笔记——SVA、Function Coverage与UVM特性详解 #### 一、SystemVerilog断言(SVA) **SVA**(SystemVerilog Assertions)是一种用于硬件验证的语言扩展,它允许用户在RTL级代码中编写断言来检查...
本篇是面向对象编程的进阶知识,内容稍微有点抽象,但是每处都标足了注释和运行结果,可以参考着学习。内容主要涉及上下文协议管理、类的装饰器使用、property方法、元类四个方面 上下文协议管理 就是with … as …...
它支持多种浏览器,如Chrome、Firefox、Internet Explorer等,并且有多种编程语言接口,包括Java、Python、C#等。 在Java中使用Selenium,首先需要下载对应的浏览器驱动,例如对于IE浏览器,你需要下载`...