2009-11-24 99 views
-1

我想有基於緊湊級蟒蛇的DSL以下形式:緊湊級DSL在python

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

MyClass()有什麼問題print_x_plus_z()'? 'c = MyOtherClass()'有什麼問題?爲什麼不直接簡單地使用Python? – 2009-11-24 16:05:19

+0

或者在每個類之後只寫'MyClass = MyClass()'。 – 2009-11-24 16:41:06

+0

你可能認爲這是一個大腦練習。 我只想要我可以製作的最完美的通用DSL。 如果可能,我不想寫MyClass = MyClass()或MyClass()。成員。 – 2009-11-24 16:57:10

回答

2

授予類(而不是其實例)的屬性,你需要有一個屬性對象作爲類的元類的屬性(所以你可能需要制定一個自定義元類來避免在具有相同元類的其他類上強加該屬性)。同樣,對於特殊的方法,如__init__ - 如果他們在課堂上,他們會影響實例(你不想做) - 讓他們影響班級,你需要讓他們在(自定義)元類。你想通過編程「一個元高級」,即從未實例化的具有自定義元類的類而不是普通類的普通實例來完成什麼?對於沒有退貨的人來說,這似乎只是一些額外的工作;-)。