python 装饰器(六):装饰器实例(三)内置装饰器
内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些。
@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。
本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/12949460.html