Je le ferais avec un décorateur. En outre, stocker la carte de sous-classe entity -> dans un dictionnaire vous permet de remplacer une analyse linéaire par une recherche dict.
class EntityBase(object):
_entity_ = None
_entities_ = {}
@classmethod
def factory(cls, entity):
try:
return cls._entities_[entity]
except KeyError:
raise FactoryError(tag, "Unknown entity")
@classmethod
def register(cls, entity):
def decorator(subclass):
cls._entities_[entity] = subclass
subclass._entity_ = entity
return subclass
return decorator
factory = EntityBase.factory
register = EntityBase.register
@register('Smith')
class Smith(EntityBase):
def __init__(self, a, b):
self.a = a
self.b = b
s = factory('Smith')(1, 2)
Je ne suis pas sûr si l'attribut __entity__
est réellement utile pour vous de si vous étiez juste à l'utiliser pour mettre en œuvre l'analyse linéaire. Je l'ai laissé dedans mais si vous l'avez sorti, alors les classes associées à l'entité n'auraient même pas besoin d'hériter de EntityBase
et vous pourriez le renommer en quelque chose comme Registry
. Cela réduit votre arbre d'héritage et ouvre la possibilité d'utiliser sur des classes qui ne sont pas liées par la descendance commune.
Selon ce que votre cas d'utilisation est une meilleure façon de le faire, il pourrait juste être
factory = {}
class Smith(object):
def __init__(self, a, b):
self.a = a
self.b = b
factory['Smith'] = Smith
class Jones(object):
def __init__(self, c, d):
self.c = c
self.d = d
factory['Jones'] = Jones
s = factory['Smith'](1, 2)
j = factory['Jones'](3, 4)
Le décorateur est colombophile et nous allons nous sentir bien et de fantaisie sur nous-mêmes, mais le dictionnaire est clair, utile et le point. C'est facile à comprendre et difficile à se tromper. A moins que vous ayez vraiment besoin de faire quelque chose de magique, alors je pense que c'est la voie à suivre. Pourquoi voulez-vous faire cela, de toute façon?
Qu'essayez-vous de faire? Python est dactylographié, pas besoin de relations d'héritage quand vous n'êtes pas en train d'hériter ... – delnan
Comment puis-je trouver mes entités sans héritage? Itère toutes les sous-classes d'objets? – W55tKQbuRu28Q4xv
@ W55tKQbuRu28Q4xv Comment pouvez-vous trouver toutes vos entités * avec * héritage? De plus, ce que vous faites ici ne "trouve" pas une sous-classe concrète - elle crée une nouvelle sous-classe chaque fois que 'entity()' est appelé, même avec les valeurs 'name' avec lesquelles il a été appelé auparavant. – llasram