擅长:python、mysql、java
<p>我想这是您想要Python <a href="http://docs.python.org/reference/datamodel.html#customizing-class-creation" rel="noreferrer">metaclass</a>的少数几种情况之一:</p>
<pre><code>class Entity(object):
class __metaclass__(type):
ENTITIES = {}
def __new__(mcs, name, bases, cdict):
cls = type.__new__(mcs, name, bases, cdict)
try:
entity = cdict['_entity_']
mcs.ENTITIES[entity] = cls
except KeyError:
pass
return cls
@classmethod
def factory(cls, name):
return cls.__metaclass__.ENTITIES[name]
class Smth(Entity):
_entity_ = 'SMTH'
def __init__(self, a, b):
self.a = a
self.b = b
s = Entity.factory("SMTH")(1, 2)
print (s.a, s.b)
</code></pre>
<p>与代码的一些细微差别:</p>
<ul>
<li>不需要用<code>entity()</code>工厂函数创建一个子类,然后将该子类子类化。这种方法不仅创建了比所需的更多的子类,而且还会使代码无法工作,因为<code>EntityBase.__subclasses__()</code>不包含<code>Smth</code>类。在</li>
<li>以<code>__</code>开头和结尾的标识符是为Python保留的,因此我使用<code>_entity_</code>属性而不是{<cd6>}。在</li>
</ul>