将对象变为其子类的一个实例

Goh*_*ohu 2 python oop

是否可以将对象变为初始对象类的派生类的实例?就像是:

class Base():
    def __init__(self):
        self.a = 1

    def mutate(self):
        self = Derived()

class Derived(Base):
    def __init__(self):
        self.b = 2
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

>>> obj = Base()
>>> obj.mutate()
>>> obj.a
1
>>> obj.b
AttributeError...
Run Code Online (Sandbox Code Playgroud)

如果不可能,我该怎么办?
我的问题如下:我的Base类就像一个"摘要",Derived类就是"整体".当然,获取"整件事"有点贵,所以只要有可能是这两个类的重点就在编写摘要.但是如果你愿意的话,你应该能够得到它,然后就不再有摘要了,所以每次对摘要的引用现在应该(或至少包含)整个事情.我想我必须创建一个可以容纳两者的类,对吧?

class Thing():
    def __init__(self):
        self.summary = Summary()
        self.whole = None

    def get_whole_thing(self):
        self.whole = Whole()
Run Code Online (Sandbox Code Playgroud)

Don*_*ows 6

一般的OOP方法是使摘要对象成为Façade,将昂贵的操作委托给(动态构造的)后端对象.你甚至可以让它完全透明,这样对象的调用者就不会发现有任何事情发生了(好吧,除非他们当然开始计时).


Ale*_*lli 6

回答提出的原始问题,将mutate方法更改为:

def mutate(self):
    self.__class__ = Derived
Run Code Online (Sandbox Code Playgroud)

将完成所要求的 - 改变自己的课程Derived而不是Base.这不会自动执行Derived.__init__,但如果需要,可以显式调用它(例如self.__init__(),与方法中的第二个语句一样).

对于OP的实际问题,这是否是一个好的方法是一个完全不同的问题,而不是原来的问题

是否可以将对象变为初始对象类的派生类的实例?

对此的答案是"是的,它是可能的"(并且它按照我刚刚展示的方式完成)."对于我的特定应用问题,它是最好的方法"是一个不同的问题,而不是"它是否可能";-)