Python将自身更改为继承类

标签 python class oop superclass self

我有这样的结构:

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。

最佳答案

在 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')

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

关于Python将自身更改为继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722714/

相关文章:

java - Java 是否完全遵循面向对象的编程模型?

python - igraph 来自 numpy 或 pandas 邻接矩阵的图

python - Django 嵌套查询集

python - 如何修复 "image "pyimage1 0"doesn' t 存在”错误,为什么会发生?

class - 与 Self 相同的后代类方法的变量是否应该有权访问其祖先的 protected 方法?

python - Pygame 中的关卡设计

oop - 中介者与观察者面向对象设计模式

python - 为什么我的带有 if-elif 语句的递归函数返回 None?

c++ - 定义一个结构体中没有默认构造函数的类

java - 重写 toString() 以表示对象的字符串的原因和好处是什么?