创建类的装饰器

2024-09-27 00:18:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一节课

class Test:
    name = "Test"

我想创建一个decorator mc\u me,之后:

@mc_me
class Test:
    name = "Test"

将为我提供三门课程,就像我写的那样:

class Test:
    name = "Test"

class TestSuper:
    name = "TestSuper"

class TestExtra:
    name = "TestExtra"

所以本质上第一个棘手的部分是深度复制一个类,第二个是在调用者的作用域上分配三个变量。感觉应该有可能。。。你知道吗


Tags: nametestdecoratormc作用域class课程me
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是您的朋友)。你知道吗

事实证明,放弃decorator的思想,使用一个返回元组的正则函数,最接近我想要的结果。你知道吗

# 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)

不可能。上三节课很容易。把结果分配给3个变量?这违反了Python的范围规则。你知道吗

@mc_me
class Test:
    name = "Test"

相当于

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

对于decorator来说,没有办法说它想创建更多的变量并分配给这些变量。即使您设法使它工作(可能只在具有inspect疯狂性的模块或类范围内),Python也无法知道对TestSuperTestExtra的引用应该引用在编译字节码时由装饰器创建的变量。你知道吗

相关问题 更多 >

    热门问题