在尝试时,我写道:
class Bag:
pass
g = Bag()
print(g)
哪位给了我:
<__main__.Bag object at 0x00000000036F0748>
让我感到惊讶。我在尝试初始化时遇到了错误,因为我没有定义__init___
。
为什么不是这种情况?
答案 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.