了解在子类中调用父类 __init__

Adj*_*con 2 python initialization class subclass

Python新手,很好奇是否有人可以尽可能用通俗易懂的方式解释为什么当你创建子类时,你仍然需要调用父类初始化函数?

假设您有一个这样的父类:

class Pet(object):

    def __init__(self, name, species):
        self.name = name
        self.species = species

    def getName(self):
        return self.name

    def getSpecies(self):
        return self.species

    def __str__(self):
        return "%s is a %s" % (self.name, self.species)
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个名为“Dog”的子类,它显然使用了父类中的一些函数。我的研究告诉我,我需要做这样的事情:

class Dog(Pet):

    def __init__(self, name, chases_cats):
        Pet.__init__(self, name, "Dog")
        self.chases_cats = chases_cats

    def chasesCats(self):
        return self.chases_cats
Run Code Online (Sandbox Code Playgroud)

但是,如果我在定义子类时将父类作为参数传递,为什么我需要调用父类的呢__init__?这不是因为它是子类而自动传递给子类吗?

我确信我在理解中遗漏了一些明显的东西,但它只是不适合我。

Bre*_*arn 6

我要问的是:为什么会这样?如果您从父类继承,那么您从父类继承所有内容(包括 )不是理所当然的吗__init__

如果您要覆盖它,则不会。如果您的子类没有定义自己的,那么确实会调用__init__超类。__init__但是,如果子类确实定义了自己的__init__,那么您将覆盖它,因此 Python 不会假设您要如何或是否要调用超类实现。

这为您提供了额外的灵活性。如果自动调用超类__init__,则必须统一在子类之前或之后调用__init__。但由于它不会自动调用,因此您可以随时调用它。你可以在子类的开头__init__、结尾、中间的某个地方调用它,或者根本不调用它。这意味着您的子类可以在超类方法起作用之前“设置”事物,或者在超类方法起作用之后“调整”事物,或者两者兼而有之,或者完全替换超类功能。

另外,如果自动调用超类实现,则如果子类不接受与超类相同的参数,则不清楚该怎么做。通过显式超类调用,您的子类可以比其超类接受更多或更少的参数,并且可以自行决定在调用超类时传递什么。