Это не то, что происходит.
Создается один экземпляр, то есть одновременно 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
Так что вы можете использовать методы Дога, но это не отдельный экземпляр!
(Также обратите внимание, что при использовании вне тела метода подкласса super()
требует, чтобы параметры класса и экземпляра были заданы явно)