Python:让每个实例都有一个不同的超类

时间:2013-10-15 22:34:39

标签: python metaclass

在Python中,我目前有类MyClass('name1')MyClass('name2')等类的实例。

我想这样做,以便每个实例都有自己的超类,即我希望MyClass('name1')成为Name1MyClassMyClass('name2')的实例,成为{{1}的实例}}。 Name2MyClassName1MyClass将是Name2MyClass的动态生成子类。我无法弄清楚如何做到这一点,因为似乎Python总是从MyClass返回该类的一个实例。我不清楚如何在元类中做到这一点。

我想这样做的原因是我想在实例上定义__new__文档字符串。但似乎__doc__在实例上完全忽略了help;它只在课堂上看。因此,要在每个实例上放置不同的文档字符串,我需要使每个实例都有自己的自定义类。

1 个答案:

答案 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}}