为什么__init__显然是可选的?

时间:2013-09-20 05:48:58

标签: python python-3.x

在尝试时,我写道:

class Bag:   
    pass

g = Bag()
print(g)

哪位给了我:

<__main__.Bag object at 0x00000000036F0748>

让我感到惊讶。我在尝试初始化时遇到了错误,因为我没有定义__init___

为什么不是这种情况?

3 个答案:

答案 0 :(得分:10)

您只需要覆盖要更改的方法。

换句话说:

如果不覆盖__init__,则会调用超类的__init__方法。

E.g。

class Bag:
    pass

如果相当于:

class Bag:
    def __init__(self):
        super(Bag, self).__init__()

此外,__init__确实是可选的。它是实例初始值设定项

当您实例化一个类(通过调用它)时,将调用(类方法__new__)的构造函数。构造函数返回一个为其调用__init__的实例。

所以在实践中甚至:

class Bag:
    def __init__(self):
        pass

工作得很好。

答案 1 :(得分:1)

__init__是一个初始化器而不是构造函数。如果定义了__init__方法,它仅用于使用作为参数提供的值初始化创建的对象。即使没有为类定义__init__方法,也无法初始化,因此无论如何都会创建一个对象,因为__init__方法不会被覆盖以根据您的需要进行自定义。

答案 2 :(得分:1)

如果您不打算添加/更改其功能,则无需包含__init__方法。 python中的所有内容都是一个对象,python对象有许多内置方法,其中一些可能在创建自己的对象时包含,有些则可能不包括。这对于学习内置方法并不是一个糟糕的参考。

http://www.rafekettler.com/magicmethods.html

我可能会添加一件事。如果您打算使用super函数,最好定义从object继承的对象。也许这在python 3+中不是必需的,但对于某些旧版本来说肯定是正确的。

class Bag(object):
    def __init__(self):
        super(Bag, self).__init__()
        # Adding extra functionality here.