Переопределение метода о наследовании Python - PullRequest
0 голосов
/ 02 декабря 2018

Я читаю документацию по Python 3.7.И меня очень смущают следующие предложения:


"Производные классы могут переопределять методы своих базовых классов. Поскольку методы не имеют специальных привилегий при вызове других методов того же объекта, метода базового классакласс, который вызывает другой метод, определенный в том же базовом классе, может в конечном итоге вызвать метод производного класса, который переопределяет его (для программистов на C ++: все методы в Python являются фактически виртуальными.) "


Можете ли вы показать мне пример кода , что «базовый класс, который вызывает другой метод, определенный в том же базовом классе, может в итоге вызвать метод производного класса, который переопределяет его»?И вот мое понимание:

class A:
def me(self):
    print("This is A")

def idet(self):
    self.me()


class B(A):
    def me(self):
        print("this is B")


a = A()
b = B()
b.me()
b.idet()

результат

this is B
this is B

Я не уверен, так ли это.

Ипоследний вопрос что означает «все методы в Python являются фактически виртуальными»?(Я знаком с Java, но не C ++)

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

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

В вашей программе вы сначала вызываете b.me(), который является переопределенным методом;Таким образом, он будет выполнять me() из класса B.Затем у вас есть b.idet(), который является скопированным методом из базового класса A;Таким образом, его код не изменится.Но когда вы внимательно посмотрите на тело метода idet(), он будет вызывать метод me() класса, из которого он вызывается.В этом случае, поскольку классом, вызывающим этот метод, является класс B, он будет выполнять метод me() из класса B.

idet() has self.me();self ссылки на ключевые слова для класса атрибутов / методов, в котором оно написано.

0 голосов
/ 02 декабря 2018

Пример показывает этот принцип точно.b, который является экземпляром B, вызывает метод ident, определенный в классе A, который, в свою очередь, вызывает me.Поскольку B переопределяет me, вызывается метод B, и вы распечатываете this is me.

В C ++ методы не могут быть переопределены по умолчанию - вы должны объявить ихкак virtual, чтобы получить это поведение.В Python (и в Java, о которой вы упоминали, вы знакомы) это поведение по умолчанию.В Java вы можете изменить метод, чтобы его нельзя было переопределить, определив его как final.

...