Что-то вроде виртуального метода в C ++ (вызов метода реализации производного класса посредством ссылки или указателя на базовый класс) не имеет смысла в Python, так как Python не имеет типирования. (Хотя я не знаю, как работают виртуальные методы в Java и PHP.)
Но если под "виртуальным" вы подразумеваете вызов самой нижней реализации в иерархии наследования, то это то, что вы всегда получаете в Python, как указывают несколько ответов.
Ну, почти всегда ...
Как указал dplamp, не все методы в Python ведут себя так. Дандер метод не делает. И я думаю, что это не очень известная особенность.
Рассмотрим этот искусственный пример
class A:
def prop_a(self):
return 1
def prop_b(self):
return 10 * self.prop_a()
class B(A):
def prop_a(self):
return 2
Теперь
>>> B().prop_b()
20
>>> A().prob_b()
10
Однако рассмотрим это
class A:
def __prop_a(self):
return 1
def prop_b(self):
return 10 * self.__prop_a()
class B(A):
def __prop_a(self):
return 2
Теперь
>>> B().prop_b()
10
>>> A().prob_b()
10
Единственное, что мы изменили, это сделали prop_a()
более грубый метод.
Проблема с первым поведением может заключаться в том, что вы не можете изменить поведение prop_a()
в производном классе, не влияя на поведение prop_b()
. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. ”.