相关:Python对象转换
我最近了解到Python允许您像这样更改实例的类:
class Robe:
pass
class Dress:
pass
r = Robe()
r.__class__ = Dress
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚是否存在"转化"这样的对象可能有用的情况.我在IDLE中搞砸了这个,我注意到的一件事是,分配一个不同的类不会调用新类的__init__方法,尽管如果需要可以明确地完成.
事实上,我能想到的每个用例都可以通过编写更好地服务,但我是一个新编码,所以我知道什么.;)
对于不相关的类,很少有充分的理由这样做,例如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
Run Code Online (Sandbox Code Playgroud)
在此示例中,Derived类的__new__方法希望使用base_factory返回Base类实例的方法构造其对象.通常这种工厂位于图书馆的某个地方,你无法确定它是如何制作这个对象的(你不能只是打电话Base()或者super(Derived, cls).__new__(cls)你自己得到相同的结果).
__class__重写实例的属性,以便调用的结果Derived.__new__将是Derived类的实例,这将确保它将Derived.__init__在其上调用方法(如果存在这样的方法).