Python中的紧凑类DSL

-1 投票
1 回答
808 浏览
提问于 2025-04-15 16:20

我想要创建一种紧凑的基于类的Python领域特定语言(DSL),形式如下:

class MyClass(Static):
    z = 3
    def _init_(cls, x=0):
        cls._x = x

    def set_x(cls, x):
        cls._x = x

    def print_x_plus_z(cls):
        print cls._x + cls.z

    @property
    def x(cls):
        return cls._x

class MyOtherClass(MyClass):
    z = 6
    def _init_(cls):
        MyClass._init_(cls, x=3)

我不想在后面写 MyClass()MyOtherClass()。我只想通过类的定义来实现这个功能。

MyClass.print_x_plus_z()
c = MyOtherClass
c.z = 5
c.print_x_plus_z()
assert MyOtherClass.z == 5, "instances don't share the same values!"

我使用了元类,成功让 _init_print_x 和子类化正常工作,但属性却不行。有没有人能推荐更好的替代方案?我使用的是Python 2.4以上的版本。

1 个回答

2

要给一个(和它的实例不同)添加一个属性,你需要把这个属性对象作为类的元类(metaclass)的一个属性。这样,你可能需要创建一个自定义的元类,以避免把这个属性强加给其他使用相同元类的类。对于像__init__这样的特殊方法也是一样——如果这些方法在类上,它们会影响到实例(而你可能不想这样)——要让它们影响类本身,你需要把它们放在(自定义的)元类上。你这样做的目的是什么呢?就是把所有东西都放在“一个元层级上”,也就是使用自定义元类的类,而不是正常类的正常实例?这似乎只是多了一点额外的工作,却没有什么实际的好处;-)

撰写回答