2009-09-16 5 views
0

Quelqu'un peut-il me dire comment lier à une classe enfant spécifique à l'exécution dans le code suivant? Je veux instance mCar dans l'exemple suivant rediriger vers la classe Truck ou Compact en fonction des options de ligne de commande?Python: lier la classe enfant à l'exécution

class Car(object): 
    pass 

class Truck(Car): 
    pass 

class Compact(Car): 
    pass 

et une instance de Car

mCar = Car() 
+0

Ce code fonctionne. Quelle est votre question? –

+0

Comme suggéré par GHZ, je veux lier mCar à Truck ou Compact à l'exécution en fonction de certaines conditions d'exécution. – WuJanJai

+0

"certaine condition d'exécution"? Qu'est-ce que ça veut dire? Voulez-vous dire une déclaration if? Pouvez-vous donner un exemple de code de ce que vous essayez de faire? –

Répondre

4

Vous voulez dire comme ça?

car_classes = { 
'car'  : Car, 
'truck' : Truck, 
'compact' : Compact 
} 

if __name__ == '__main__': 
    option = sys.argv[1] 
    mCar = car_classes[option]() 
    print 'I am a', mCar.__class__.__name__ 
+0

Salut, Gahooa Je pense que cela devrait fonctionner dans certains cas. Je suis curieux de savoir s'il y a d'autres moyens comme « transtypage » ou changement « __class__ » en voiture :: __ __ initialisation() Merci – WuJanJai

+1

Eh bien, vous pouvez utiliser une usine de classe ou même __metaclass__ http://en.wikibooks.org/wiki/Python_Programming/MetaClasses mais à moins que vous n'en ayez vraiment besoin, il est probable qu'il soit trop puissant. – GHZ

+0

Salut, GHZ Merci pour le pointeur. C'est exactement ce dont j'ai besoin. – WuJanJai

1

Comme une note de côté, alors que pas particulièrement recommandé, il est possible d'attribuer une valeur différente de self.__class__ - être que dans __init__ ou nulle part ailleurs. Notez que cela va changer les recherches pour les noms au niveau de la classe (comme les méthodes), mais en soi ça ne changera pas l'état de l'instance (ni invoquer implicitement n'importe quel type d'initialisation - vous devrez le faire explicitement si vous avez besoin ça arrive) ... ces subtilités font partie des raisons pour lesquelles de telles astuces ne sont pas particulièrement recommandées (avec le penchant culturel général des Pythonistes contre la "magie noire" ;-) et une "fonction d'usine" (qui dans des cas particulièrement simples peut être réduire à une recherche dict, comme dans la réponse de GHZ) est l'approche recommandée.

+0

Merci beaucoup pour l'explication. L'affectation de self .__ class__ est ce que j'ai vu dans un code tiers. Mais il me semble que cela doit être fait avec beaucoup d'attention, comme vous l'avez mentionné. – WuJanJai

Questions connexes