如何添加到从另一个 class 继承的 python class 的初始定义?

How can I add to the initial definition of a python class inheriting from another class?

我试图在继承自 class

的 class 中定义 self.data
class Object():
    def __init__(self):
        self.data="1234"

class New_Object(Object):
    # Code changing self.data here

但我 运行 遇到了问题。

class Object():
    def __init__(self):
        self.data="1234"

所以我这里有开头的class,是从别处引进的,再说class是通用的,根本没法修改原来的

原来实例在class中被称为“self”,在定义__init__.

中被定义为self
class New_Object(Object):
    # Code changing self.data here

所以如果我想继承class Object,但是在New_Object里面定义self.data,我想我必须定义__init__New_Object 中,但这会覆盖 New_Object

中的 __init__

有什么方法可以做到这一点而无需从 Object 复制粘贴 __init__

您使用 super 调用原始实现。

class New_Object(Object):
    def __init__(self):
        super(NewObject, self).__init__()
        self.info = 'whatever'

这就是 super 的用途:

class NewObject(Object):

    def __init__(self):
        super(NewObject, self).__init__()
        # self.data exists now, and you can modify it if necessary

您可以使用 super().__init__()New_Object.__init__() 调用 Object.__init__()

你会做什么:

class Object:
    def __init__(self):
        print("Object init")
        self.data = "1234"

class New_Object(Object):
    def __init__(self):
        print("calling super")
        super().__init__()
        print("data is now", self.data)
        self.data = self.data.split("3")

o = New_Object()

# calling super
# Object init
# data is now 1234

请注意,您不必为 super() 提供任何参数,只要您使用 Python 3.

答案是您在子class的__init__期间显式地调用超级class的__init__。这可以通过以下两种方式之一完成:

Object.__init__(self)   # requires you to name the superclass explicitly

super(NewObject, self).__init__()   # requires you to name the subclass explicitly

后者还要求您确保使用的是 "new-style" classes:在 Python 3 中总是如此,但在 Python 2 中您必须确保从内置 object class 继承。在Python3中其实可以更简单的表达:

super().__init__()

就我个人而言,在我的大部分代码中,"disadvantage" 必须显式命名 superclass 一点也不不利,并且 Object.__init__() 提供了透明度,因为它绝对清楚什么叫做。这是因为我的大部分代码只是单一继承。当你有多重继承时, super 路由就派上用场了。参见 What does 'super' do in Python?

Python 2 例子:

class Object(object):
    def __init__(self):
        self.data = "1234"

class NewObject:
    def __init__(self):
        # subclass-specific stuff
        super(NewObject, self).__init__()
        # more subclass-specific stuff