【问题标题】:Python change self to inherited classPython将self更改为继承类
【发布时间】:2014-01-10 10:37:29
【问题描述】:

我有这种结构:

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。

【问题讨论】:

  • 您要解决的实际问题是什么?
  • 请详细说明您为什么要这样做。
  • 您永远不需要将超类强制转换为其子类之一,这是设计缺陷的标志。
  • @SimeonVisser 这不是真的。特别是,它可能适用于反序列化等过程。
  • @SimeonVisser 不,实例化一次然后强制执行是有意义的。显然,这取决于格式和环境的限制。在 C++ 中更常见的是这样做(就地使用new),但同样的原因也适用于 Python。我敢打赌它们不适用于 OP 的问题,但这不是“从不”的事情。

标签: python class oop superclass self


【解决方案1】:

在 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__ialisation。
【解决方案2】:

你可以这样做:

def changeToGoo(self, val2):
    return Goo(self.val1, val2)

然后调用赋值,添加额外的属性

a = a.changeToGoo(val2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2019-05-08
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多