每个类都有__init__方法.如果它没有明确定义一个,那么它将从其父类继承一个.在第二个示例中,该类从基础对象类继承__init__和一堆其他方法(以及其他非方法属性).我们可以通过dir函数看到:
class Dog:
def init_instance(self,name):
self.name = name
print('My name is',name)
print(dir(Dog))
产量
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'init_instance']
在构造实例之后(通过__new__方法)自动调用__init__,因此如果我们需要初始化实例,我们也可以使用它.但是我们可以显式调用你的init_instance:
bob = Dog()
bob.init_instance('Bob')
print(bob.name)
产量
My name is Bob
Bob
如果你为类提供一个名为__init__的初始化程序,那么它将不会被自动调用. Python应该如何知道该方法是初始化器?尽管习惯上将__init__作为类定义中的第一个方法,但这绝不是强制性的,有些人喜欢将__init__放在最后.
你说:“我看过没有使用过init方法的代码,为什么会这样?”好吧,有些类根本不需要初始化它们的实例:它们的实例属性是通过各种其他方法设置的,或者通过在类定义之外的代码中直接赋值,例如bob.color =’brown’.或者他们从父类继承了一个完全可用的__init__.