考虑以下示例。 Parent
类有一个名为attr
的属性。 Child1
和Child2
都具有相同名称的属性。 Child1
和Child2
之间的唯一区别是Child1
在覆盖父{q} super()
属性之前调用attr
。 Child2
似乎不会覆盖父attr
,因为该属性是在super()
调用之前定义的。 Child2
是否有办法在attr
来电之前定义父super()
时覆盖父class Parent():
def __init__(self):
self.attr = "parent"
class Child1(Parent):
def __init__(self):
super().__init__()
self.attr = "child1"
class Child2(Parent):
def __init__(self):
self.attr = "child2"
super().__init__()
if __name__ == '__main__':
child1 = Child1()
print(child1.attr) # "child1"
child2 = Child2()
print(child2.attr) # "parent"
?
{{1}}
答案 0 :(得分:3)
没有"父母的attr
" 和"孩子的{{1} }}" 。该实例上只有一个attr
,无论它是从父类中的代码设置,还是从子类中的代码设置,还是从没有类的代码设置。
换句话说,这些例子产生了相同的结果:
attr
class A:
def __init__(self):
self.attr = 1
class B(A):
pass
b = B()
class A:
pass
class B(A):
def __init__(self):
self.attr = 1
b = B()
因此,class A:
pass
class B(A):
pass
b = B()
b.attr = 1
和Child1
之间的区别在于Child2
' s Child1
执行此操作:
__init__
self.attr = "parent"
self.attr = "child1"
' s Child2
有效地做到了这一点:
__init__
答案 1 :(得分:1)
没有。 super().__init__()
是调用超类__init__
的简写,将当前实例作为self
传递。
考虑创建Child2
实例时会发生什么。首先,"裸露"创建了类的实例。必须初始化此实例。为此,Python将此实例作为Child2.__init__
传递给self
。现在Child2.__init__
首先向此实例添加attr
属性。但接下来会调用super().__init__()
,在这种情况下,Parent.__init__(self)
是简写self
。至关重要的是,Child2
是我们正在初始化的Parent.__init__
实例的实例。因此attr
会覆盖此实例的super().__init__()
属性。
通常,最好将__init__
调用放在您的子类class Parent(object):
def __init__(self):
print('Here I am, in the parent! My ID is: ' + str(id(self)))
class Child(Parent):
def __init__(self):
print('Initializing new Child instance with ID: ' + str(id(self)))
super().__init__()
中。这不是一个真正的限制,大多数人都会期望它首先出现。
演示程序流程的示例:
Child
这样创建Initializing new Child instance with ID: 4372063120
Here I am, in the parent! My ID is: 4372063120
的实例就会打印出来:
If(comboBox10.SelectedItem != null)
{
cmd.CommandText = "insert into data ([Auto Date],AKA,[Phone Number],[R ID],[Related Phone],[Profession]) values ('" + textBox1.Text + "','" + textBox12.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + comboBox10.SelectedItem.ToString() + "')";
}
else
{
cmd.CommandText = "insert into data ([Auto Date],AKA,[Phone Number],[R ID],[Related Phone],[Profession]) values ('" + textBox1.Text + "','" + textBox12.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + "" + "')";
}