在 python 中调用继承对象

calling an object with inheritance in python

首先,我是 python 的新手,但我一直在努力工作,并做了很多教程和示例项目以变得更好,所以,如果我遗漏了一些明显的东西,我道歉。

一段时间以来,我一直在努力解决这个问题,我在这里和通过谷歌进行了多次搜索,但我不太明白如何转换我的示例找到了我正在寻找的东西,所以我希望这里有人能给我一个正确方向的推动。

class Super1:
    def __init__(self,artib1,atrib2,atrib3):
        self.atrib1 = atrib1
        self.atrib2 = atrib2
        self.atrib3 = atrib3

class Sub1(Super1):
    def __init__(self,atrib4,atrib5,atrib6)
        self.atrib4 = atrib4
        self.atrib5 = atrib5
        self.atrib6 = atrib6

好的,所以我无法弄清楚的是,在我完成的教程中,他们说我可以像这样调用 class:

spam = Super1("eggs","foo","bar")

如果我输入

print spam.atrib1

会吐出来

eggs

我想做的是使 spam = Sub1,但我不知道如何调用它,以便我可以像使用 Super1 那样设置所有“属性”。

我查阅了一些 'multiple inheritance' 示例,但我似乎无法将这些示例与我自己的需要相协调。大多数教程没有超过 1 个属性,或者经常有 sub 'override' super 的属性。

我也检查了组合,但我不确定这正是我在项目的这一部分中寻找的东西,但我知道我会在后面的部分中需要它。

如果有人能指出正确的方向,那就太好了。

  1. 你需要调用父class的构造函数Super1.__init__(self)
  2. 您还需要允许 Sub1 为父 class 的构造函数获取参数。

经过以上修改,您的代码变为:

class Sub1(Super1):
    def __init__(self, artib1, atrib2, atrib3, atrib4, atrib5, atrib6)
        Super1.__init__(self, artib1, atrib2, atrib3)
        self.atrib4 = atrib4
        self.atrib5 = atrib5
        self.atrib6 = atrib6

但是,与其自己调用父 class 的构造函数,不如使用 super 内置函数:

super(Sub1, self).__init__(artib1, atrib2, atrib3)

这样,您就不必在每个子classes 构造函数中硬编码父class 的名称。这使您可以轻松地重构代码。使用 super 的另一个额外好处是,它将自动处理多重继承问题的棘手细节,例如 "diamond inheritance".

另外一条建议是,如果你不知道 super class 将使用的位置参数的数量,你可以使用 *args 语法:

class Sub1(Super1):
        def __init__(self, atrib4, atrib5, atrib6, *args)
            super(Sub1, self).__init__(*args)
            self.atrib4 = atrib4
            self.atrib5 = atrib5
            self.atrib6 = atrib6

如果你打电话给spam = Super1("eggs","foo","bar")。它将调用 Super class 构造函数。

问题是,如果您想为 Sub1 创建一个实例,您应该 spam = Super1("eggs","foo","bar",atrib4,atrib5,atri6)。您还必须将 Sub1 的构造函数更改为:

def __init__(self,atrib1,atrib2,atrib3,atrib4,atrib5,atrib6):
     Super1.__init__(self,atrib1,atrib2,atrib3)
     self.atrib4 = atrib4
     self.atrib5 = atrib5
     self.atrib6 = atrib6`

如果 Sub1 继承自 Super1,这应该意味着它 是一个 Super1(添加了一些额外的东西,或进行了一些定制)。但是你不能删除东西,所以Sub1必须

  1. 包含 Super1 包含的所有内容
  2. 通过在其自己的构造函数中调用 super(Sub1,self).1.__init__(self, ...) 来初始化自身的 Super1 部分。

所以,如果你的 super class 有一个成员 a,其值被传递给它的构造函数,你的 subclass also 有(继承)一个成员 a,并且必须以某种方式将它的值传递给 superclass 构造函数。

是否意味着

class Sub1(Super1):
    def __init__(self, a, b, c, d, e, f):
        super(Sub1, self).__init__(a,b,c)
        self.d=d
        self.e=e
        self.f=f

或者 super 和 subclass 参数之间是否存在某种关系(或者 subclass 对一些 superclass 参数进行硬编码,或者...)取决于在你的代码上。