我可能是错的,但我不认为你想要一个元类。 __metaclass__
es 在创建类时使用,而不是在您调用类来构造类的新实例(或其他东西)时使用。
__new__
这是一个没有元类的答案。感觉有点hacky,但它似乎工作:
_sentinel = Ellipsis
class MyClass(object):
def __new__(cls, name):
if name is _sentinel:
return object.__new__(cls)
else:
instance = type(name + cls.__name__, (MyClass,), {})(_sentinel)
# Initialization goes here.
return instance
print type(MyClass('name1'))
print type(MyClass('name2'))
这里有一个问题——初始化新实例的所有业务逻辑都必须在__new__
. 由于__new__
返回的类型与其绑定的类不同,__init__
因此不会被调用。
另一种选择是创建一个类工厂:
class MyClass(object):
pass
def class_factory(name):
new_cls = type(name + MyClass.__name__, (MyClass,), {})
return new_cls() # Or pass whatever you want in here...
print type(class_factory('name1'))
print type(class_factory('name2'))
最后,您甚至可以创建一个非__new__
类方法:
class MyClass(object):
@classmethod
def class_factory(cls, name):
new_cls = type(name + cls.__name__, (cls,), {})
return new_cls() # Or pass whatever you want in here...
print type(MyClass.class_factory('name1'))
print type(MyClass.class_factory('name2'))