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

Python 创建子类的实例时,也会创建其超类的实例,是否可以访问它?,python,inheritance,Python,Inheritance,我在python中学习了继承,python中非常清楚,一旦创建了子类的实例,相应的超类的实例也会被创建 class Dog(): def __init__(self,breed,age,hasowner): print('Dog created') self.breed = breed self.age = age; self.hasowner = hasowner; specie = 'mammal' c

我在python中学习了继承,python中非常清楚,一旦创建了子类的实例,相应的超类的实例也会被创建

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


    specie = 'mammal'

class Beagle(Dog):

    def __init__(self):
        Dog.__init__(self,'beagle',5,True)
        print('beagle created')
my_beagle = Beagle()
正如预期的那样,当执行以下代码时,“Dog created”和“Beagle created”都打印在控制台上


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

它不是这样工作的。未“同时”创建Dog的实例。有一个例子,那就是狗和小猎犬;因为小猎犬就是狗


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

事实并非如此

创建一个实例,即同时创建一只
Beagle
和一只
Dog
。对
Beagle.\uuuu init\uuuu
中的
Dog
类中的方法的调用也只是在Dog中运行代码-作为超类实例的子类必须提供要运行的祖先上的代码。(这通常是通过使用
super()
而不是硬编码超类名来实现的)

此外,在静态类型语言中,通常可以将子类“强制转换”到它的一个超类中,这样就可以创建一个“Beagle”,将它强制转换为“Dog”,并直接调用结果对象上的“Dog”方法—Python中不是这样—通常不可能将对象“强制转换”到它的超类中。rahter,任何接受超类类型的对象的调用也将接受其任何子类的对象

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

class Dog():
定义初始(自我、品种、年龄、所有者):
打印('Dog created')
自我繁殖
self.age=年龄
self.hasowner=hasowner
def树皮(自身):
打印(“狗叫”)
物种=‘哺乳动物’
比格犬(狗)级:
定义初始化(自):
super().uuu init_uuuu('beagle',5,True)
打印('创建小猎犬')
def树皮(自身):
印刷品(“小猎犬树皮”)
我的小猎犬
可以这样做(粘贴上面的代码段后,从交互式控制台输出):

因此,您可以使用Dog的方法,但它不是一个单独的实例!
(还要注意,当在子类方法体之外使用时,
super()
要求显式给出类和实例参数)

my_beagle
现在也是一个
Dog
对象<代码>我的比格犬品种将存在并初始化。和
super()。\uuuu init\uuuu('beagle',5,True)
是调用父类的initializer的python方法。值得一提的是,您可以使用
super()
访问已在子类中重写的父类的属性。我还想知道:在我的代码中,Beagle的所有实例对于属性Bread age和hasowner是否共享相同的值?因此,这在某种程度上模拟了类对象属性的行为?没有
breed
age
hasowner
是实例属性,因此它们不被共享-它们是使用例如
self.breed
访问的<代码>种类是类属性。
In [147]: my_beagle.bark()                                                                                                                             
beagle bark

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