• 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-list
    C3P0数据库连接池使用中的问题
    不变类和可变类
    apollo配置中心部署文档
    Apollo使用文档(Java)
    Redis偶发连接失败案例分析
    创建Kibana耗时报表
    Session服务器配置,如何保存在专门的StateServer服务器中
    Linux命令对应的英文全称
    IIS记录真实来源IP,Advanced Logging(高级日志)的安装以及X-Forwarded-For的配置
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12949460.html
Copyright © 2020-2023  润新知