在 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 的属性。
我也检查了组合,但我不确定这正是我在项目的这一部分中寻找的东西,但我知道我会在后面的部分中需要它。
如果有人能指出正确的方向,那就太好了。
- 你需要调用父class的构造函数
Super1.__init__(self)
- 您还需要允许
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
必须
- 包含
Super1
包含的所有内容
- 通过在其自己的构造函数中调用
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 参数进行硬编码,或者...)取决于在你的代码上。
首先,我是 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 的属性。
我也检查了组合,但我不确定这正是我在项目的这一部分中寻找的东西,但我知道我会在后面的部分中需要它。
如果有人能指出正确的方向,那就太好了。
- 你需要调用父class的构造函数
Super1.__init__(self)
- 您还需要允许
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
必须
- 包含
Super1
包含的所有内容 - 通过在其自己的构造函数中调用
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 参数进行硬编码,或者...)取决于在你的代码上。