【问题标题】:What happens when your class does not explicitly define an __init__ method?当你的类没有明确定义 __init__ 方法时会发生什么?
【发布时间】:2018-01-16 19:03:01
【问题描述】:

如果我不在 python 中使用__init__ 方法,我的代码质量会受到怎样的影响?一个简单的例子将不胜感激。

【问题讨论】:

  • 质量是一个词,取决于你。没有 init 可以有高质量的代码,但你明白为什么构造函数在任何类中都很重要(推广到每种语言的每个类)
  • 我看不出任何建设性的方式来回答这个问题,而不仅仅是对 OO 原则的广泛讨论。也许您可以尝试使用或不使用__init__ 编写一些非玩具类,看看您认为有什么区别,如果需要,请询问有关您的真实代码的问题?
  • 顺便说一句 - title 是一个完全可以回答的问题。关于代码质量的部分是使它过于宽泛的部分。这是一个巨大的讨论。

标签: python class


【解决方案1】:

简答;什么都没有发生。

长答案;如果你有一个类B,它继承自类A,并且如果B 没有定义__init__ 方法,则调用父类(在本例中为A__init__

In [137]: class A:
     ...:     def __init__(self):
     ...:         print("In A")
     ...:         

In [138]: class B(A): pass

In [139]: B()
In A
Out[139]: <__main__.B at 0x1230a5ac8>

如果A 没有前任,则调用全能超类object__init__,它什么也不做。

您可以通过查询dunder __mro__来查看类层次结构。

In [140]: B.__mro__
Out[140]: (__main__.B, __main__.A, object)

另请参阅Why do we use __init__ in Python classes? 了解有关何时何地使用它的适当情况。

【讨论】:

    【解决方案2】:

    这里不是质量问题,在python支持的Object-oriented-design中,__init__是先创建对象时提供数据的方式。在OOPS 中,这称为constructor。换句话说构造函数是一种准备有效对象的方法

    大型项目的设计模式依赖于 python 提供的构造函数功能。没有这个,它们将无法运行,

    例如

    • 您想要跟踪为类创建的每个对象,现在您需要一个在每次创建对象时执行的方法,因此需要 构造函数

    • 构造函数的其他有用示例是假设您想为银行创建一个customer 对象。现在银行的客户必须有一个account number,所以基本上你必须为银行的有效客户对象设置规则,因此需要构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2013-04-29
      • 2011-05-05
      相关资源
      最近更新 更多