在Python中,我目前有类MyClass('name1')
,MyClass('name2')
等类的实例。
我想这样做,以便每个实例都有自己的超类,即我希望MyClass('name1')
成为Name1MyClass
和MyClass('name2')
的实例,成为{{1}的实例}}。 Name2MyClass
和Name1MyClass
将是Name2MyClass
的动态生成子类。我无法弄清楚如何做到这一点,因为似乎Python总是从MyClass
返回该类的一个实例。我不清楚如何在元类中做到这一点。
我想这样做的原因是我想在实例上定义__new__
文档字符串。但似乎__doc__
在实例上完全忽略了help
;它只在课堂上看。因此,要在每个实例上放置不同的文档字符串,我需要使每个实例都有自己的自定义类。
答案 0 :(得分:2)
我可能错了,但我认为你不想要一个元类。创建类时使用__metaclass__
es,而不是在调用类来构造类的新实例(或其他内容)时使用__new__
。
这是使用没有元类的_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'))
的答案。感觉有点hacky,但似乎有效:
__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'))
类方法:
{{1}}