Когда вы создаете экземпляр подкласса, также создается экземпляр его суперкласса, возможно ли получить к нему доступ? - PullRequest
0 голосов
/ 05 июля 2019

Я узнал о наследовании в 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?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Это не так, как это работает.Экземпляр Dog не "также" создан.Существует один экземпляр, то есть и Собака и Бигль;потому что Beagle "is-a" Dog.

Точка наследования заключается в том, что любой атрибут, определенный для Dog, также доступен на Beagle (если вы не переопределите его).

0 голосов
/ 05 июля 2019

Это не то, что происходит.

Создается один экземпляр, то есть одновременно 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() требует, чтобы параметры класса и экземпляра были заданы явно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...