2009-11-24 6 views
-1

Je veux avoir DSLs python à base de classe compacte sous la forme suivante:DSL Compact classe en 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) 

Je ne veux pas écrire MyClass() et MyOtherClass() après. Je veux juste que cela fonctionne avec seulement les définitions de classe.

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!" 

J'utilisé métaclasses et a réussi à obtenir _init_, print_x et subclassing fonctionne correctement, mais les propriétés ne fonctionnent pas. Quelqu'un pourrait-il suggérer une meilleure alternative? J'utilise Python 2.4+

+1

Qu'est-ce qui ne va pas avec 'MyClass(). Print_x_plus_z()'? Quel est le problème avec 'c = MyOtherClass()'? Pourquoi ne pas simplement utiliser Python correctement? –

+0

ou écrivez juste 'MyClass = MyClass()' après chaque classe. –

+0

Vous pourriez considérer cela comme un exercice cérébral. Je veux juste le DSL universel le plus parfait que je puisse faire. Je ne veux pas écrire un membre MyClass = MyClass() ou MyClass(). Si cela est possible. –

Répondre

2

Pour donner une classe (par opposition à ses instances) une propriété, vous devez avoir cet objet de la propriété comme un attribut de métaclasse de la classe (de sorte que vous aurez probablement besoin de créer une métaclasse personnalisée pour éviter d'infliger cette propriété à d'autres classes avec la même métaclasse). De même pour les méthodes spéciales telles que __init__ - si elles sont sur la classe, elles affecteraient les instances (que vous ne voulez pas faire) - pour qu'elles affectent la classe, vous devez les avoir sur le) métaclasse. Qu'est-ce que vous essayez d'accomplir en programmant tout "un métalevel up", c'est-à-dire une classe jamais instanciée avec une métaclasse personnalisée plutôt qu'avec des instances normales d'une classe normale? Il semble juste une légère quantité de travail supplémentaire pour aucun retour ;-).