在进行实验时,我写道:
class Bag:
pass
g = Bag()
print(g)
这给了我:
<__main__.Bag object at 0x00000000036F0748>
这让我很惊讶。当我尝试初始化它时,我预计会出错,因为我没有定义__init___
.
为什么不是这样?
在进行实验时,我写道:
class Bag:
pass
g = Bag()
print(g)
这给了我:
<__main__.Bag object at 0x00000000036F0748>
这让我很惊讶。当我尝试初始化它时,我预计会出错,因为我没有定义__init___
.
为什么不是这样?
您只需要覆盖您想要更改的方法。
换句话说:
如果不覆盖__init__
,__init__
则将调用超类的方法。
例如
class Bag:
pass
如果相当于:
class Bag:
def __init__(self):
super(Bag, self).__init__()
此外,__init__
确实是可选的。它是一个实例的初始化器。
当您实例化一个类(通过调用它)时,会调用该类的构造函数(类方法__new__
)。构造函数返回一个__init__
被调用的实例。
所以在实践中甚至:
class Bag:
def __init__(self):
pass
会工作得很好。
__init__
是一个初始化器而不是构造器,如果__init__
定义了一个方法,它仅用于使用作为参数提供的值初始化创建的对象。即使__init__
没有为类定义方法,但也没有初始化,无论如何都会创建一个对象,因为__init__
方法不会被覆盖以根据您的需要进行自定义。
__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.