异同
相同
使用方式相册,都是@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
网友评论