Python中的包装类
装饰是一种为函数和类指定管理代码的方法。装饰器本身采用处理其他可调用对象的可调用对象的形式。类装饰器类似于函数装饰器,但它们在类语句的末尾运行以将类名重新绑定到可调用对象(例如函数)。因此,它们可以用于在创建类后立即管理类,也可以在稍后创建实例时插入一层包装逻辑来管理实例。类装饰器可用于直接管理类对象,而不是实例调用——使用新方法增加/修改类。类装饰器与函数装饰器密切相关,事实上,它们使用几乎相同的语法和非常相似的编码模式,但在某些地方逻辑不同。
注意:有关详细信息,请参阅Python中的装饰器
句法:
在语法上,类装饰器出现在类语句之前。
@decorator
class Class_Name:
...
inst = Class_Name(50)
This piece of code is equivalent to
class Class_Name:
...
Class_Name = decorator(Class_Name)
inst = Class_Name(50);
让我们通过一个例子来理解语法,以及它是如何工作的:
例子:
# decorator accepts a class as
# a parameter
def decorator(cls):
class Wrapper:
def __init__(self, x):
self.wrap = cls(x)
def get_name(self):
# fetches the name attribute
return self.wrap.name
return Wrapper
@decorator
class C:
def __init__(self, y):
self.name = y
# its equivalent to saying
# C = decorator(C)
x = C("Geeks")
print(x.get_name())
输出:
Geeks
在此示例中,装饰器将类 C 重新绑定到另一个类 Wrapper,后者将原始类保留在封闭范围内,并在调用原始类时创建并嵌入原始类的实例(包装)。在更简单的语言中, @decorator
等价于C = decorator(C)
,它在类 C 的定义结束时执行。在装饰器主体中,包装类修改类 C 保持原创性或不更改cls(x)
返回一个 C 类的对象(其 name 属性用 x 的值初始化)。 get_name 方法返回包装对象的名称属性。最后在输出中打印“Geeks”。
因此,这是该类的装饰器或包装器的概述。类装饰器用于向类添加附加功能,而无需更改原始类以在任何情况下根据需要使用。