【问题标题】:Compact Class DSL in pythonpython中的紧凑类DSL
【发布时间】:2010-12-19 22:29:33
【问题描述】:

我希望有以下形式的基于紧凑类的 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+

【问题讨论】:

  • MyClass().print_x_plus_z() 有什么问题? c=MyOtherClass() 有什么问题?为什么不简单地正确使用 Python?
  • 或者在每节课后写MyClass=MyClass()
  • 您可以将其视为大脑锻炼。我只想要我能做的最完美的通用 DSL。如果可能的话,我不想写 MyClass=MyClass() 或 MyClass().member。
  • 我不明白打破语言如何创建“最完美的通用 DSL”。这似乎主要是为了制造混乱。
  • 我不明白这个问题。这是不清楚和不完整的。如果你不想澄清它,也许你不应该问。请澄清问题,以便可以回答。你想做什么?为什么要颠覆对象定义?有什么意义?

标签: python class singleton properties dsl


【解决方案1】:

要给一个(相对于它的实例)一个属性,你需要将该属性对象作为类元类的一个属性(这样你就可以可能需要创建一个自定义元类以避免将该属性施加到具有相同元类的其他类上)。类似地,对于诸如 __init__ 之类的特殊方法——如果它们在类上,它们会影响实例(你不想这样做)——要让它们影响类,你需要将它们放在(自定义)元类。你想通过编程“一个元级别”的所有内容来完成什么,即从未实例化的具有自定义元类的类而不是普通类的普通实例?这似乎只是一点点额外的工作没有回报;-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多