很少有充分的理由对不相关的类执行此操作,例如Robe
您Dress
的示例。没有一点工作,很难确保你最终得到的对象处于理智状态。
但是,如果您想使用非标准工厂函数或构造函数来构建基对象,则在从基类继承时会很有用。这是一个例子:
class Base(object):
pass
def base_factory():
return Base() # in real code, this would probably be something opaque
def Derived(Base):
def __new__(cls):
self = base_factory() # get an instance of Base
self.__class__ = Derived # and turn it into an instance of Derived
return self
在这个例子中,派生类的__new__
方法想要使用base_factory
返回Base
类实例的方法来构造它的对象。通常这种工厂位于某个库中,您无法确定它是如何制作对象的(您不能只调用Base()
或super(Derived, cls).__new__(cls)
自己获得相同的结果)。
实例的__class__
属性被重写,因此调用的结果Derived.__new__
将是Derived
该类的一个实例,这确保了它将具有Derived.__init__
调用它的方法(如果存在这样的方法)。