Python将self更改为继承类

4

我有这样一种结构:

class Foo:
    def __init__(self, val1):
        self.val1 = val1

    def changeToGoo(self)
        HOW???

class Goo(Foo):
    def __init__(self, val1, val2):
        super(val1)
        self.val2 = val2

a = Foo(1)
a.changeToGoo()

'a'现在是Foo的一个实例
现在我想通过使用"changeToGoo"方法将其更改为Goo的实例,并添加其他值。

这可以在Python中如何完成?

我已经尝试过:

self.__class__ = Goo

但是当我检查时:
type(a)

它仍然是Foo,而不是Goo。


3
你想要解决的实际问题是什么? - NPE
1
请详细说明为什么您想这样做。 - jcklie
2
你永远不应该将超类强制转换为其子类之一,这是设计缺陷的标志。 - Simeon Visser
@SimeonVisser 这并不正确。特别是在反序列化中,使用它是可以适当的。 - Marcin
1
@SimeonVisser 不,实例化一次然后向下转换是有意义的。显然,这取决于格式和环境的限制。在C++中更常见(使用就地new),但同样的原因也适用于Python。我敢打赌它们不适用于OP的问题,但这不是一个“从不”的事情。 - Marcin
显示剩余5条评论
2个回答

6
在Python 2中,让Foo继承自object,使其成为新式类:
>>> class Foo(object):
...     def __init__(self, val1):
...         self.val1 = val1
... 
>>> class Goo(Foo):
...     def __init__(self, val1, val2):
...         super(val1)
...         self.val2 = val2
... 
>>> f=Foo(1)
>>> f.__class__
<class '__main__.Foo'>
>>> f.__class__ = Goo
>>> f
<__main__.Goo object at 0x10e9e6cd0>
>>> type(f)
<class '__main__.Goo'>

现在你可以改变 self.__class__。在一个名为 changeToGoo() 的方法中:

def changeToGoo(self)
    self.__class__ = Goo
    self.val2 = 'some value'

或者重用__init__

def changeToGoo(self)
    self.__class__ = Goo
    self.__init__(self.val1, 'some value')

这确实使你的对象有些怪异,因为它们会改变身份。变形很少是个好主意。您可能需要重新考虑您的使用情况。


这是正确的,但子类的对象也应该经过__init__初始化。 - Marcin

2
你可以做以下事情:
def changeToGoo(self, val2):
    return Goo(self.val1, val2)

然后调用并分配,添加额外的属性。
a = a.changeToGoo(val2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接