python 装饰器(六):装饰器实例(三)内置装饰器

2021-09-24 23:16

阅读:678

标签:直接   span   value   函数返回   self   ini   封装   eth   基础上   内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些。 @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() @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。python 装饰器(六):装饰器实例(三)内置装饰器标签:直接   span   value   函数返回   self   ini   封装   eth   基础上   原文地址:https://www.cnblogs.com/qiu-hua/p/12949460.html


评论


亲,登录后才可以留言!