内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些。

@property

在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性。

def getx(self):
return self._x def setx(self, value):
self._x = value def delx(self):
del self._x # create a property
x = property(getx, setx, delx, "I am doc for x property")

以上就是一个Python属性的标准写法,其实和Java挺像的,但是太罗嗦。有了@语法糖,能达到一样的效果但看起来更简单。

@property
def x(self): ... # 等同于 def x(self): ...
x = property(x)

属性有三个装饰器:settergetterdeleter ,都是在property()的基础上做了一些封装,因为setterdeleterproperty()的第二和第三个参数,不能直接套用@语法。

getter装饰器和不带getter的属性装饰器效果是一样的,估计只是为了凑数,本身没有任何存在的意义。

经过@property装饰过的函数返回的不再是一个函数,而是一个property对象。

>>> property()
<property object at 0x10ff07940>

@staticmethod,@classmethod

有了@property装饰器的了解,这两个装饰器的原理是差不多的。

@staticmethod返回的是一个staticmethod类对象,而@classmethod返回的是一个classmethod类对象。

他们都是调用的是各自的__init__()构造函数。

class classmethod(object):
"""
classmethod(function) -> method
"""
def __init__(self, function): # for @classmethod decorator
pass
# ...
class staticmethod(object):
"""
staticmethod(function) -> method
"""
def __init__(self, function): # for @staticmethod decorator
pass
# ...

装饰器的@语法就等同调用了这两个类的构造函数。

class Foo(object):

    @staticmethod
def bar():
pass # 等同于 bar = staticmethod(bar)

至此,我们上文提到的装饰器接口定义可以更加明确一些,

装饰器必须接受一个callable对象,其实它并不关心你返回什么,

可以是另外一个callable对象(大部分情况),也可以是其他类对象,比如property。

最新文章

  1. C#使用ADO.NET访问数据库(一)
  2. pod install 无限卡顿
  3. winform异步系统升级—BackgroundWorker
  4. vim和tmux主题颜色不一致问题
  5. Bootstrap - 全局css样式类
  6. jQuery 日历控件 FullCalendar 初识
  7. 《JavaScript高级程序设计》笔记(2):位操作符
  8. java中dynamic web project与web project 的区别 [转]
  9. BZOJ 1833: [ZJOI2010]count 数字计数( dp )
  10. 如何借助Motion操控Linux监控摄像头
  11. android 反编译(dex 和 odex),非脑残转帖,绝对可靠
  12. web workers工作线程
  13. 嵌入式linux下wifi网卡的使用(四)——应用程序sub_supplicant编译
  14. ExtJS:文件上传实例
  15. MySQL实战45讲学习笔记:日志系统(第二讲)
  16. C语言之指针变量
  17. php 实现双向链表
  18. 基于TCP的安卓客户端开发
  19. zabbix之 zabbix模板监控mysql
  20. 关于jquery中on绑定click事件在苹果手机失效的问题

热门文章

  1. laravel clone后需要做的操作
  2. Docker_01
  3. Java中的map集合顺序如何与添加顺序一样
  4. Linux下,如何监控某个进程到底向哪个地址发起了网络调用
  5. 【01JMeter基础】测试计划
  6. 兄弟打印机MFC代码示范
  7. Git 居然可以用来跟女神聊天?
  8. Redis安装过程jemalloc/jemalloc.h报错
  9. Centos安装redis详解
  10. 说说TCP的三次握手和四次挥手