python 装饰器(六):装饰器实例(三)内置装饰器
2024-10-09 04:58:23
内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些。
@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)
属性有三个装饰器:setter
, getter
, deleter
,都是在property()
的基础上做了一些封装,因为setter
和deleter
是property()
的第二和第三个参数,不能直接套用@语法。
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。
最新文章
- C#使用ADO.NET访问数据库(一)
- pod install 无限卡顿
- winform异步系统升级—BackgroundWorker
- vim和tmux主题颜色不一致问题
- Bootstrap - 全局css样式类
- jQuery 日历控件 FullCalendar 初识
- 《JavaScript高级程序设计》笔记(2):位操作符
- java中dynamic web project与web project 的区别 [转]
- BZOJ 1833: [ZJOI2010]count 数字计数( dp )
- 如何借助Motion操控Linux监控摄像头
- android 反编译(dex 和 odex),非脑残转帖,绝对可靠
- web workers工作线程
- 嵌入式linux下wifi网卡的使用(四)——应用程序sub_supplicant编译
- ExtJS:文件上传实例
- MySQL实战45讲学习笔记:日志系统(第二讲)
- C语言之指针变量
- php 实现双向链表
- 基于TCP的安卓客户端开发
- zabbix之 zabbix模板监控mysql
- 关于jquery中on绑定click事件在苹果手机失效的问题