【发布时间】:2021-11-21 03:23:24
【问题描述】:
我正在尝试装饰一个班级
def decorate_module(Module):
class Wrapper(Module):
def __init__(self, cfg):
self.c = create_c(**cfg)
super().__init__()
return Wrapper
虽然代码有效,但它提供了一个名为“Wrapper”的类,而不是原始模块的名称。在功能装饰方面,这种情况下可以使用@wraps。我在课堂上尝试了同样的事情(通过在 class Wrapper(Module): 上方写它但出现错误。
这样做的正确方法是什么? python 内置装饰器@dataclass 似乎处理得很好。我想知道它是如何工作的。有没有像@wraps 这样的辅助函数?还是我应该手动覆盖__name__?如果是这样,这些“双下划线”属性的完整列表是什么?
(编辑)我最初的目的
给定一个在__init__ 中不接受任何参数的类,我想将其装饰为接受一个参数“cfg”,执行一些操作(create_c),并将其存储为一个属性。
确切地说,我的装饰器实际上将“create_c”作为参数(我在上面的代码中省略了这一点,因为额外的嵌套会使它变得冗长)。然后,我想如下使用它。
@decorate_module(create_fn1)
class Module1:
...
@decorate_module(create_fn2)
class Module2:
...
【问题讨论】:
-
通常装饰器修改一个类而不是完全替换它。你的装饰器的实际目的是什么?
-
@nzer0 如果您将一个类子类化并赋予它与父类相同的名称,您究竟期望什么?你觉得
ModuleJr合理吗? -
下划线属性列表
for i in dir(my_class): print(i) if i.startswith('__') and i.endswith('__') else i
标签: python class wrapper python-decorators class-decorator