python装饰器、描述符、自定义属性访问方式

Posted by     "hehaoran" on Monday, April 26, 2021

TOC

1. 描述符:

_get_, __set__, __delete__(比如内置的property方法,也是装饰器@property)将某个特殊类型的类的实例指派给另一个类的属性

  • _get_(self, instance, owner): 用于访问属性,返回属性的值

  • _set_(self, instance, value): 将在属性分配操作中被调用,不返回任何内容

  • _delete_(self, instance): 控制删除操作,不返回任何内容

self: 指的是被包装的函数(即这个类装饰器的实例). instance: 代表实例,即另一个类的self. owner: 代表类本身,即另一个类.

https://www.cnblogs.com/JohnABC/p/5685672.html

注:del 是析构器 简单理解为del *时触发

2. @property详解

    @property
    def public_key(self):
        return self._public_key
    # property是一个函数装饰器
    def property(func):
        exec(func.__name__ +'=Property(func)') # 在功能上exec > eval
        return eval(func.__name__)

大概的过程是这样的: (1)首先将public_key函数以函数名的方式传给函数装饰器property。 (2)再将public_key以参数的形式传给一个描述符类Property。 (3)通过内置函数exec实例化一个Property对象,并重新赋值给func,即public_key = Property(public_key)。 (4)最后返回这个新func函数给这个类,成为类属性。

因此,那么你在get, set, del这个类属性的时候就会触发 _get_, __set__, __delete__.

https://blog.csdn.net/u012867844/article/details/83782562

3. 自定义属性访问方式

  • _getattr_(self, name) 定义当用户试图获取一个不存在的属性时的行为(只有不存在时才被执行)

  • _getattrbute_(self, name) 定义当该类的属性被访问时的行为(先于__getattr__方法,一定会被执行)

  • _setattr_(self, name, value) 定义当一个属性被访问时的行为

  • _delattr_(self, name) 定义当一个属性被删除时的行为

@property定义的是具体某个实例属性的行为,而__getattribute__等是定义全部实例属性的行为。如果这样的属性比较多时,需要定义一个描述符类

4. 装饰器类

用类写装饰器于函数装饰器的不同在于,前者返回的其实是这个类装饰器的实例,而后者返回的是被装饰后的函数。因此,定义__call__方法可以将类的实例变成可调用对象,实现像函数一样的调用。

在islet.utils.decorators.wrapper_send中加入以下代码

    # instance赋值给self.__call__的第一个参数,即func.
    # 但是后面又被赋值为被装饰的函数了。加了这句对于这个装饰器没什么影响
    def __get__(self, instance, owner):
        return partial(self.__call__, instance)

https://zhuanlan.zhihu.com/p/44667584 https://zhuanlan.zhihu.com/p/269012332 https://blog.csdn.net/qq_26406447/article/details/88703492

「真诚赞赏,手留余香」

Haoran Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付