我可以看到实现这项工作的多个障碍,这很可能是不可能的,但我想我至少会问......

所以,我有一个类 AbstractEnumeratedConstantsGroup ,不出所料,当子类创建一个代表一组枚举常量的对象(ex FLAVORS 与值 ('VANILLA', 'CHOCOLATE', 'STRAWBERRY') 其中 FLAVORS[0] 返回 'VANILLA'FLAVORS[1] 返回 'CHOCOLATE'FLAVORS.VANILLA 返回,0 等)一个元类和一些其他的步法,以便创建一个新的常量组所需的一切是:

class FLAVORS(AbstractEnumeratedConstantsGroup):
    _constants = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
FLAVORS = FLAVORS()

我想进一步减少它:
@enumerated_constants_group
FLAVORS = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')

我不知道如何过去的问题是:

1. 没有好的方法从装饰器代码的定义范围中获取对象的标签名称
2. 不能装饰不是类、方法或函数的东西

我已经考虑过使用工厂/构建器,但我不喜欢的是它需要在代码中重复组名,或者组具有无用的 FLAVORS.CHOCOLATE 值(在 1__name__ 中使用)。前任:
FLAVOR = enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))

或者
FLAVOR = enumerated_constants_group(('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# FLAVOR.__name__ becomes some unfriendly machine-generated string

作为装饰器思想的替代方案,是否可以从工厂方法引用调用范围(通过内省(introspection)或将其隐式传递给函数),以便调用该方法会将新创建的对象插入到调用命名空间中给定的名字?前任:
enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# I could now reference FLAVOR in any arbitrary scope that the method was called from

有什么我可以做的来实现我想要的吗?还有其他我没有想到的方法吗?

最佳答案

没有一般方法可以影响分配给裸名称(如在 FLAVORS = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY') 中)时发生的情况。所以你想要的是不可能的。

也就是说,您可以编写一个元类,用它自己的一个实例替换返回的类,这样就不需要第一个示例中的最后一行 FLAVORS = FLAVORS(...) 了。类定义本身就足以创建对象。

关于python - 在对象实例上使用装饰器(或其他模式)生成类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11783715/

10-12 16:49