zoukankan      html  css  js  c++  java
  • 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生成器
    $思维导图——numpy基本知识
    $python用装饰器实现一个计时器
    $ MySQL-python数据库模块用法
    CentOS 7.2下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1
    Nginx、Apache工作原理及Nginx为何比Apache高效
    Apache的三种工作模式及相关配置
    ThinkPHP框架
    session与cookie的区别是什么?如果客户端禁用了cookie功能,将会对session有什么影响?
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12949460.html
Copyright © 2011-2022 走看看