【问题标题】:Is this Python example still initializing an object (without __init__)这个 Python 示例是否仍在初始化对象(没有 __init__)
【发布时间】:2014-09-09 08:00:11
【问题描述】:

我还在学习 OOP 的概念,所以如果这是一个糟糕的问题,请原谅我:

如果需要 __init__ 在 Python 中实例化一个对象,为什么不调用 __init__ 就可以进行以下操作?:

class Person:
    #Note the lack of __init__(self):
    def run(self):
        print('I am a person')

man = Person()
man.run() #Prints 'I am a person')

【问题讨论】:

    标签: python oop python-3.x


    【解决方案1】:

    来自python documentation

    实例化操作(“调用”一个类对象)创建一个 空对象。许多类喜欢用实例创建对象 定制为特定的初始状态。因此一个类可以定义一个 名为init()的特殊方法,像这样...

    所以__init__ 不是必需的,它是python 提供的机制,允许您在初始化对象时设置它的初始状态。

    【讨论】:

    • 谢谢。我不知道我是怎么错过的。顺便说一句,您是否阅读了整个教程,如果是,您会推荐它(在 Python 方面的书籍,例如我现在正在阅读的书籍)
    • @Startec 我个人认为阅读整个教程可能会有点让人不知所措(我自己没有读过),但我建议你将它作为参考书来寻找具体部分您感兴趣或需要使用的语言:并发编程,数据结构,......您会发现自己在长时间使用python之后已经完全阅读了它。然而,这只是我的看法。
    • 谢谢,我从来没有得到任何人的意见,并且正在/正在考虑直接阅读。
    • @Startec Building Skills in Python, by Steven F.Lott 对我来说是必须。已经看完了,现在要读第二个标题Building Skills in Object-Oriented Design
    【解决方案2】:

    如果除了父类提供的初始化之外不需要进行任何初始化,则无需创建__init__ 函数。请注意,任何父类的 __init__ 函数都会自动调用:

    In [1]: class Parent(object):
       ...:     def __init__(self):
       ...:         print 'Inside __init__ of parent'
    
    In [2]: class Person(Parent):
       ...:     def run(self):
       ...:         print 'I am a person'
    
    In [3]: p = Person()
    Inside __init__ of parent
    
    In [4]: p.run()
    I am a person
    

    在现代 Python 中,任何类都隐式地派生自 object 类,据说该类负责分配内存空间等基本事务,即使您不添加任何其他属性也是如此。

    【讨论】:

      【解决方案3】:

      __init__ 是一个构造函数,这是一个简单的函数,当你创建一个对象时会调用它。它通常用于设置对象以使其可以使用。如果不存在__init__,则仍将创建对象。它只是意味着对象在构造时没有完成任何事情。

      【讨论】:

      • 从技术上讲,Python 使用 2 阶段初始化方案,因此没有合适的“构造函数”——有一个分配器 (__new__) 和一个初始化器 (__init__)。初始化程序只有在存在时才会被调用,因此可以让分配器完成所有初始化工作而根本没有初始化程序(FWIW 就是不可变类型 IIRC 的情况)。
      • @brunodesthuilliers 仍然,python 数据引用将 __init__ 函数称为构造函数 (docs.python.org/3/reference/…)。我所知道的所有 OOP 语言都允许构造函数“接触”对象的内部成员,这意味着对象的分配已经完成。我不认为这是 python 的特例。
      猜你喜欢
      • 2010-12-06
      • 2012-03-22
      • 2017-07-20
      • 2015-12-07
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多