1

我有一堂课

class Test:
    name = "Test"

我想创建一个装饰器 mc_me 之后:

@mc_me
class Test:
    name = "Test"

将为我提供三个类,就像我写的一样:

class Test:
    name = "Test"

class TestSuper:
    name = "TestSuper"

class TestExtra:
    name = "TestExtra"

所以基本上第一个棘手的部分是深度复制一个类,第二个是在调用者的范围内分配三个变量。感觉应该是有可能的……

4

3 回答 3

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 是您的朋友)。

于 2013-08-30T09:47:08.173 回答
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)
于 2013-08-30T15:42:50.137 回答
0

不可能。制作 3 节课很容易。但是,将结果分配给 3 个变量?这违反了 Python 的作用域规则。

@mc_me
class Test:
    name = "Test"

相当于

class Test:
    name = "Test"
Test = mc_me(Test)

装饰器无法说它想要创建更多变量并分配给这些变量。即使您以某种方式设法使其工作(可能只是在inspect疯狂的模块或类范围内),Python 也无法知道在编译字节码时引用TestSuperTestExtra应该引用装饰器创建的变量。

于 2013-08-30T09:26:21.990 回答