擅长:python、mysql、java
<p>我会找个装修工来做。另外,在字典中存储entity->;子类映射可以让您用dict查找替换线性扫描。在</p>
<pre><code>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)
</code></pre>
<p>我不确定<code>__entity__</code>属性是否真的对您有用,或者您只是使用它来实现线性扫描。我保留了它,但是如果你去掉它,那么与实体相关的类甚至不需要从<code>EntityBase</code>继承,你可以将它重命名为<code>Registry</code>。这会使继承树变浅,并打开了在通过公共继承没有关联的类上使用的可能性。在</p>
<p>根据您的用例是什么,更好的方法可能是</p>
^{pr2}$
<p>让我们觉得字典是有用的,但我们自己觉得这本字典是好的,更花哨。这很容易理解,很难出错。除非你真的需要做些魔术,否则我认为那是正确的方法。你为什么要这么做?在</p>