4

在进行实验时,我写道:

class Bag:   
    pass

g = Bag()
print(g)

这给了我:

<__main__.Bag object at 0x00000000036F0748>

这让我很惊讶。当我尝试初始化它时,我预计会出错,因为我没有定义__init___.

为什么不是这样?

4

3 回答 3

10

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

换句话说:

如果不覆盖__init____init__则将调用超类的方法。

例如

class Bag:
    pass

如果相当于:

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

此外,__init__确实是可选的。它是一个实例的初始化器

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

所以在实践中甚至:

class Bag:
    def __init__(self):
        pass

会工作得很好。

于 2013-09-20T05:50:59.113 回答
1

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

于 2013-09-20T06:29:33.700 回答
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.
于 2013-09-20T06:53:54.470 回答