我有一个班级
class Test:
name = "Test"
我想创建一个装饰器mc_me,后面是:
@mc_me
class Test:
name = "Test"
将为我提供三个类,就像我写的那样:
class Test:
name = "Test"
class TestSuper:
name = "TestSuper"
class TestExtra:
name = "TestExtra"
所以基本上第一个棘手的部分是深度复制一个类,第二个是在调用者的作用域上分配三个变量。感觉它应该可能以某种方式......
答案 0 :(得分:3)
import inspect
def mc_me(cls):
main_locals = inspect.currentframe().f_back.f_locals
for suffix in ['Super', 'Extra']:
new_name = cls.__name__ + suffix
main_locals[new_name] = type(new_name, (), {'name': new_name})
return cls
小心,这不是编码的最佳方式。拥有权利的同时也被赋予了重大的责任。我建议您查看inspect
方法的所有可能缺点(Google是您的朋友)。
答案 1 :(得分:0)
不可能。制作3节课很容易。但是,将结果分配给3个变量?这违反了Python的范围规则。
@mc_me
class Test:
name = "Test"
相当于
class Test:
name = "Test"
Test = mc_me(Test)
装饰者无法说它想要创建更多变量并分配给它们。即使你以某种方式设法使其工作(可能仅在模块或类范围内具有inspect
疯狂),Python也无法知道对TestSuper
或TestExtra
的引用应该引用编译字节码时由装饰器创建的变量。
答案 2 :(得分:0)
实际上,事实证明放弃装饰者的想法并使用返回元组的常规函数最接近于实现我想要的结果。
# Library code
def mc_me(base):
class Sp(base):
name = base.name + "Super"
class Ex(base):
name = base.name + "Extra"
return (Sp, Ex)
# Application code
class Test:
name = "Test"
(TestSuper, TestExtra) = mc_me(Test)