Je souhaite conserver un dictionnaire de sous-classes (toutes non incluses immédiatement) dans une classe de base, afin de pouvoir les instancier à partir d'une chaîne. Je fais ceci parce que le CLSID
est envoyé par l'intermédiaire d'un formulaire Web, ainsi je veux limiter les choix à ceux choisis des sous-classes. (Je ne veux pas eval()
/globals()
le nom de la classe).Comment obtenir une référence à la classe actuelle du corps de la classe?
class BaseClass(object):
CLSID = 'base'
CLASSES = {}
def from_string(str):
return CLASSES[str]()
class Foo(BaseClass):
CLSID = 'foo'
BaseClass.CLASSES[CLSID] = Foo
class Bar(BaseClass):
CLSID = 'bar'
BaseClass.CLASSES[CLSID] = Bar
Cela ne marche évidemment pas. Mais y a-t-il quelque chose comme @classmethod
pour init? L'idée est que ce classmethod ne s'exécuterait qu'une seule fois lors de la lecture de chaque classe et enregistrerait la classe avec le baseclass. Quelque chose comme ce qui suit pourrait alors travailler: (sauverait également la ligne supplémentaire dans Foo
et Bar
)
class BaseClass(object):
CLSID = 'base'
CLASSES = {}
@classmethod
def __init__(cls):
BaseClass.CLASSES[cls.CLSID] = cls
def from_string(str):
return CLASSES[str]()
Je pensais à l'aide __subclasses__
puis filter()
sur CLSID
, mais qui ne fonctionne que pour les sous-classes immédiates. Donc, en espérant que j'ai expliqué mon but, la question est de savoir comment faire fonctionner ce travail? Ou est-ce que je vais à ce sujet d'une manière complètement fausse?
Habituellement, nous utilisons une usine séparée pour cela, pas la superclasse. Pourquoi n'utilisez-vous pas le modèle de conception ** Factory ** le plus commun? –
Je pensais qu'il serait plus propre de mettre la méthode d'usine dans la super-classe. De plus, je ne veux pas avoir à coder en dur les options pour les classes/ids, je veux aussi que toute sous-classe soit autonome, afin que la classe de base et les méthodes d'usine puissent rester une boîte noire. – noio
Mettre l'usine dans la superclasse est loin d'être propre - comme votre question le révèle. "code dur les options?" n'a pas de sens. L'usine est aussi "black box" que la superclasse, donc je ne comprends pas. –