我正在学习有关python的继承的知识,在python中非常清楚的是,一旦创建了子类的实例,并且也创建了相应超类的实例
bucket field
如预期的那样,当执行以下代码时,将同时在控制台上打印“ Dog created”和“ Beagle created”。
所以我想知道如何访问创建的Dog对象?
答案 0 :(得分:1)
这不是它的工作方式。没有“创建” Dog的实例。有一个 实例,即两者 Dog和Beagle;因为小猎犬“是”狗。
继承的要点是,在Dog上定义的任何属性也可以在Beagle上使用(除非您覆盖它)。
答案 1 :(得分:0)
那不会发生。
创建一个实例,即同时创建一个Beagle
和一个Dog
。对Dog
中Beagle.__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()
在子类方法主体中使用时,需要显式给出类和实例参数)