装饰器,创建类

时间:2013-08-30 09:19:48

标签: python python-decorators

我有一个班级

class Test:
    name = "Test"

我想创建一个装饰器mc_me,后面是:

@mc_me
class Test:
    name = "Test"

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

class Test:
    name = "Test"

class TestSuper:
    name = "TestSuper"

class TestExtra:
    name = "TestExtra"

所以基本上第一个棘手的部分是深度复制一个类,第二个是在调用者的作用域上分配三个变量。感觉它应该可能以某种方式......

3 个答案:

答案 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也无法知道对TestSuperTestExtra的引用应该引用编译字节码时由装饰器创建的变量。

答案 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)