【问题标题】:What is happning over here?Does python Override这里发生了什么?python 是否覆盖
【发布时间】:2016-08-31 14:37:14
【问题描述】:

案例 1:

class A(object):
    def __init__(self):
        print "A"
class B(A):
   pass
c = b()
#output:
#A

案例 2:

class A(object):
    def __init__(self):
        print "A"
class B(A):
   def __init__(self):
       print "B"
c = b()
#output:
#B

在 case1 中运行 class A 的构造函数,在 case2 中运行 class B 的构造函数。

所以如果 case1 打印 A 被理解为它正在运行 class A 构造函数,因为 class B 继承了它。

那么在 case2 中,它只运行 class B 构造函数,而不运行 class A 构造函数,这是为什么。

现在这里发生了什么。 python 是否覆盖了class A 构造函数?或者发生了什么 “我是编程新手。”

【问题讨论】:

  • initializer 正在被覆盖。可以使用 super 访问父 initializer
  • 如果您将__init__ 放入B,它将覆盖A 中的那个。如果你不这样做,它就不会。 Python 的 __init__ 方法不会自动调用超类的 __init__ 方法。而且我不知道你为什么在标题中加上“overload”。
  • “根据 OOP 的概念,构造函数不能被继承。” – 谁说的?
  • “它应该在 case2 中运行两个构造函数” – 谁说的?
  • 你读过教程中的9, Classes吗?值得一读——对我来说好几遍。

标签: python oop constructor


【解决方案1】:

根据文档,当一个类被构造时,基类总是被记住。因此,如果找不到某个属性,它将解决所有依赖关系,该过程适用于所有基类。在您的情况下,类 B 没有 init 方法,因此它调用其父方法。在第二个例子中,如果要运行基类的构造函数,可以使用 super() 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多