Python中@property装饰器的技巧性用法(代码示例)

本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

@property装饰器能把一个方法变成属性一样来调用,下面我们就一起来看看Python的黑魔法@property装饰器的使用技巧解析

@属性有什么用呢?表面看来,就是将一个方法用属性的方式来访问。

上代码

class Circle(object):

def __init__(self, radius):

self.radius = radius

@property

def area(self):

return 3.14 * self.radius ** 2

c = Circle(4)

print c.radius

print c.area

可以看到,面积虽然是定义成一个方法的形式,但是加上@财产后,可以直接c.area,当成属性访问。

现在问题来了,每次调用c.area,都会计算一次,太浪费cpu了,怎样才能只计算一次呢?这就是懒惰的财产。

class lazy(object):

def __init__(self, func):

self.func = func

def __get__(self, instance, cls):

val = self.func(instance)

setattr(instance, self.func.__name__, val)

return val

class Circle(object):

def __init__(self, radius):

self.radius = radius

@lazy

def area(self):

print 'evalute'

return 3.14 * self.radius ** 2

c = Circle(4)

print c.radius

print c.area

print c.area

print c.area

可以看到, 'evalute' 只输出了一次,对@Lazy的机制应该很好理解。

在这里,懒惰类有__get__方法,说明是个描述器,第一次执行c.area的时候,因为顺序问题,先去Ç.__ dict__中找,没找到,就去类空间找,在类圈中,有面积()方法,于是就被__get__拦截。

在__get__中,调用实例的区域()方法算出结果,并动态给实例添加个同名属性把结果赋给它,即加到Ç.__ dict__中去。

再次执行c.area的时候,先去Ç.__ dict__找,因为此时已经有了,就不会经过区域()方法和__get__了。

注意点

请注意以下代码场景:

代码片段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(对象):

在python2下,分别运行测试

片段1:将会提示一个预期的错误信息AttributeError:无法设置属性

片段2:正确运行

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

BIF:

property([fget [,fset [,fdel [,doc]]]])

返回新样式类的属性属性(从对象派生的类)。

原来在python2下,内置类型对象并不是默认的基类,如果在定义类时,没有明确说明的话(代码片段2),我们定义的Parrot(代码片段2)将不会继承对象

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

新式课

任何继承自object的类。这包括所有内置类型,如list和dict。只有新式类可以使用Python的更新,通用的功能,如__slots__,描述符,属性和__getattribute __()。

同时我们也可以通过以下方法来验证

class A:

pass

>>type(A)

class A(object):

pass

>>type(A)

从返回的,可以看出是我们需要的对象类型(python 3.0将对象类作为默认基类,所以都将返回)

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

最后的代码将如下:

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

以上就是Python中@property装饰器的技巧性用法(代码示例)的详细内容,更多请关注码农之家其它相关文章!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)相关推荐

  1. python装饰器 property_python中property和setter装饰器用法

    作用:调用方法改为调用对象, 比如 : p.set_name() 改为 p.set_name 区别:前者改变get方法,后者改变set方法 效果图: 代码: class Person: def __i ...

  2. python对excel数据更改_利用python对excel中一列的时间数据更改格式代码示例

    本篇文章小编给大家分享一下利用python对excel中一列的时间数据更改格式代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 问题场景:需要将 ...

  3. python中formatter的用法_Python pyplot.FuncFormatter方法代码示例

    本文整理汇总了Python中matplotlib.pyplot.FuncFormatter方法的典型用法代码示例.如果您正苦于以下问题:Python pyplot.FuncFormatter方法的具体 ...

  4. python中font的用法_Python font.nametofont方法代码示例

    本文整理汇总了Python中tkinter.font.nametofont方法的典型用法代码示例.如果您正苦于以下问题:Python font.nametofont方法的具体用法?Python fon ...

  5. php 字体倾斜,CSS中font-style定义字体倾斜体样式的代码示例

    本篇文章给大家带来的内容是关于CSS中font-style定义字体倾斜体样式的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.常用斜体语法 常用字体样式设置font-st ...

  6. python内置装饰器property_Python中的内置装饰器之property

    装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能: Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 相关知识点 ...

  7. [转载] python中@property装饰器

    参考链接: Python @property装饰器 Python中有一个被称为属性函数(property)的小概念,它可以做一些有用的事情.在这篇文章中,我们将看到如何能做以下几点: 将类方法转换为只 ...

  8. pythonproperty装饰器_实例讲解Python编程中@property装饰器的用法

    取值和赋值 class Actress(): def __init__(self): self.name = 'TianXin' self.age = 5 类Actress中有两个成员变量name和a ...

  9. python3.6中@property装饰器的使用

    Python装饰器的定义.使用简单记录如下: 1.装饰器的定义: 在代码运行期间动态增加功能的方式,称之为"装饰器" 2.装饰器的作用: 本质上是一个Python函数或类,可以让其 ...

最新文章

  1. RTMP协议中的Chunk Stream ID (CID)的作用
  2. STM32 进阶教程 9 - 芯片维一码(UID)读取
  3. 框架:spring总结
  4. linux java javac版本_linux下java 和 javac version 不一致问题
  5. 字体中字号,磅值和mm之间的转换
  6. 临时节点不能有child 子节点
  7. JXSE 2.5 : What's Cool #6 -- PeerGroup Executor and ScheduledExcutor
  8. 第一次装TFS的曲折经历
  9. PHP下SESSION无法跨页传递的解决
  10. 回文数c语言构造思路,基础练习 回文数 C语言
  11. IDEA---Project下看不见项目目录
  12. DB2 SQL执行计划
  13. 华为手机文件在内部存储路径_华为手机查找文件路径 华为文件夹在哪里
  14. 图片放大后不清晰怎么处理?
  15. IDM模式是存储器产业最佳选择?
  16. 无需安卓手游模拟器,电脑玩绝地求生:全军出击TC Games完美匹配手游服
  17. SonrLint常见解决方案
  18. 批量制作带LOGO的网址二维码
  19. Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)
  20. CocoStudio基础教程(3)在程序中处理cocoStudio导出动画

热门文章

  1. 从无到有算法养成篇-线性表历练
  2. 用Tableau画可调整的树状图(Tree Diagram)
  3. HTML基础重要知识点图文,HTML5基础知识点总结
  4. python function函数_Python34-06-函数(function)
  5. Python入门100题 | 第020题
  6. 20年IT老兵分享:账务系统设计及应用--转
  7. 【推荐系统】推荐系统整体框架概览
  8. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
  9. 为什么以太坊不仅仅是一个加密货币
  10. TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,