Python中的紧凑类DSL
我想要创建一种紧凑的基于类的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__
这样的特殊方法也是一样——如果这些方法在类上,它们会影响到实例(而你可能不想这样)——要让它们影响类本身,你需要把它们放在(自定义的)元类上。你这样做的目的是什么呢?就是把所有东西都放在“一个元层级上”,也就是使用自定义元类的类,而不是正常类的正常实例?这似乎只是多了一点额外的工作,却没有什么实际的好处;-)