在Python 3中调用super()之前覆盖父类属性

时间:2016-10-22 17:53:27

标签: python class python-3.x inheritance attributes

考虑以下示例。 Parent类有一个名为attr的属性。 Child1Child2都具有相同名称的属性。 Child1Child2之间的唯一区别是Child1在覆盖父{q} super()属性之前调用attrChild2似乎不会覆盖父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}}

2 个答案:

答案 0 :(得分:3)

没有"父母的attr" "孩子的{{1} }}" 。该实例上只有一个attr,无论它是从父类中的代码设置,还是从子类中的代码设置,还是从没有类的代码设置。

换句话说,这些例子产生了相同的结果:

示例1

attr

示例2

class A:
    def __init__(self):
        self.attr = 1

class B(A):
    pass

b = B()

示例3

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 + "','" + "" + "')";
}