python 装饰器:装饰器实例内置装饰器

Posted 秋华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

属性有三个装饰器: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。

以上是关于python 装饰器:装饰器实例内置装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python基础--定义装饰器(内置装饰器)

装饰器生成器迭代器及python中内置函数的使用

python内置装饰器@property

python使用上下文对代码片段进行计时,非装饰器

python学习--装饰器生成器内置函数json

python学习笔记:装饰器生成器内置函数json