Python:如何将对象从基类提升到派生类?

2 投票
2 回答
2518 浏览
提问于 2025-04-16 06:15

希望这个问题不是太基础,但我想问一下……

假设我有一个基础类叫做 pa(),然后我有一些派生类,比如 pai()paj() 等等,这些类都是从基础类继承来的。

我想从基础类 pa() 创建一个对象:

>>> from pamod import *
>>> mypa = pa()
>>> mypa
<pamod.pa object at 0x28d4fd0>
>>>

……然后根据某些操作,把这个对象提升(转换)成一个派生类的对象:

>>> mypa.do(this)  
>>> mypa
<pamod.pai object at 0x28d4fd0>
>>>

在这里,根据“this”的值,mypa 变成了 pai 类的一个对象,等等。

我知道我可以给这个对象的 __class__ 赋值。

mypa.__class__ = pai

不过我在想,这样做是否真的是最好的方法。

在我的设想中,每个 pai 的实例(比如说)都是从基础类 pa 开始的,所以我猜 pai__init__ 方法可以以某种方式被重载。

可以参考这个讨论

彼得

2 个回答

0

我不太明白。看起来重新指定 __class__ 可以让我不必把所有东西都复制一遍,这很好,因为我们说的是一大堆(几百兆字节)的数据。

(我在这里回答我自己的问题,这样我可以包含代码)

这有什么问题吗?实际上,“x”和“y”可能代表着一些庞大的数据。调用 mypa.do(1) 会把 mypa 提升为 pai 类的一个成员:

class pa(object):
    def __init__(self):
        self.x = 1.0

    def do(self,i):
        if i==1:
            self.__class__ = pai
            self.promote()

class pai(pa):
    def __init__(self):
        pa.__init__(self)
        self.promote()

    def promote(self):
        self.y = 2.0
4

这个方法不好,因为你需要自己去处理新属性的初始化。可以在子类里写一个类方法,这个方法会返回一个新的实例,并把合适的属性复制过来。

撰写回答