创建子类的实例时,还会创建其超类的实例,是否可以访问它?

时间:2019-07-05 20:20:32

标签: python inheritance

我正在学习有关python的继承的知识,在python中非常清楚的是,一旦创建了子类的实例,并且也创建了相应超类的实例

bucket field
如预期的那样,当执行以下代码时,

将同时在控制台上打印“ Dog created”和“ Beagle created”。

所以我想知道如何访问创建的Dog对象?

2 个答案:

答案 0 :(得分:1)

这不是它的工作方式。没有“创建” Dog的实例。有一个 实例,即两者 Dog和Beagle;因为小猎犬“是”狗。

继承的要点是,在Dog上定义的任何属性也可以在Beagle上使用(除非您覆盖它)。

答案 1 :(得分:0)

那不会发生。

创建一个实例,即同时创建一个Beagle和一个Dog。对DogBeagle.__init__类中的方法的调用也只运行Dog中的代码-子类(也是超类的实例)必须提供祖先的代码。跑。 (不过,通常使用super()而不是对超类名称进行硬编码。)

此外,在静态类型的语言中,通常您可以将子类“投射”到其超类之一-这样您就可以创建“ Beagle”,将其转换为“ Dog”,并直接在其上调用“ Dog”方法生成的对象-在Python中不是这种情况-通常不可能将对象“投射”到其超类。更糟糕的是,任何将接受超类类型的对象的调用也将采用其任何子类的对象。

super(...)调用也可以用于从类方法之外显式调用超类的方法或属性-因此,如果将类声明为:

class Dog():
    def __init__(self,breed,age,hasowner):
        print('Dog created')
        self.breed = breed
        self.age = age
        self.hasowner = hasowner

    def bark(self):
        print('dog bark')


    specie = 'mammal'

class Beagle(Dog):

    def __init__(self):
        super().__init__('beagle',5,True)
        print('beagle created')

    def bark(self):
        print('beagle bark')

my_beagle = Beagle()

您可以执行此操作(粘贴上面的代码段后,从交互式控制台输出):

In [147]: my_beagle.bark()                                                                                                                             
beagle bark

In [148]: super(Beagle, my_beagle).bark()                                                                                                              
dog bark

因此您可以使用Dog的方法,但这不是单独的实例! (还请注意,super()在子类方法主体中使用时,需要显式给出类和实例参数)