美文网首页
python的装饰器与描述器的简说实例

python的装饰器与描述器的简说实例

作者: hugoren | 来源:发表于2020-02-18 10:53 被阅读0次

异同

相同

使用方式相册,都是@xxx...,如下

class A:
    @property
    def name(self):
        print("name")

不同

装饰器

是面向切面编程模式(AOP aspect-oriented programming)的一种实现,可以对原有功能做扩展或者彻底的改变,而不改变外部的调用方式。
为了不改变所装饰的性质, 可加上@functools.wrap

  • 函数装饰器
  • 不带参数
def no_param_decorator(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper


@no_param_decorator
def test():
    return "test"
  • 带参数
def param_decorator(role):
    def call(func):
        def wrapper(*args, **kwargs):
            print(role)
            return func(*args, **kwargs)
        return wrapper
    return call


@param_decorator("test...")
def test():
    return "test"
  • 类装饰器
class Decorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(*args, **kwargs)
        r = self.func(*args, **kwargs)
        return r


@Decorator
def test():
    return "test"

print(test())
描述器

描述器是任何一个实现了描述器协议(get(), set(), 或者 delete())的对象。类的属性或实例是调用的优先级的调用。
数据描述器与非数据描述器是少一个get的区别

  • 数据描述器
class Description:
    def __set__(self, instance, value):
        print("__set__", instance)

    def __get__(self, instance, owner):
        print("__get__", instance)
  • 非数据描述器
class Description:
    def __set__(self, instance, value):
        print("__set__", instance)

    def __get__(self, instance, owner):
        print("__get__", instance)

测试

class A:
    dataDescription = Description()
    noDataDescription = NoDescription()

a = A()


a.dataDescription = "set"
a.noDataDescription = "no set"
print(a.dataDescription)
print(a.noDataDescription)

参考

Python中的装饰器(decorator)与描述器(descriptor)
https://www.jianshu.com/p/cc1e8a18b708

相关文章

网友评论

      本文标题:python的装饰器与描述器的简说实例

      本文链接:https://www.haomeiwen.com/subject/gigwfhtx.html