Вызов метода базового класса из объекта производного класса python

У меня есть два класса и методы с одинаковым именем. У меня есть объект производного класса. Когда я вызываю метод (foo) из объекта производного класса, он должен вызывать метод базового класса.

class A:
    def foo(self):
        print "A Foo"

class B(A):
    def foo(self):
        print "B Foo"

b = B()
b.foo() # "B Foo"

После некоторого поиска я получил какое-то решение, как показано ниже, и не уверен, правильно ли это сделать или нет.

a = A()
b.__class__.__bases__[0].foo(a) # A Foo

Есть ли лучший способ сделать это.

Вы должны перейти на Python 3. Если вы должны использовать Python 2, A должен наследоваться от object, чтобы сделать его классом нового стиля (где "новый" означает Python 2.2 и выше, или около 17 лет!), тогда вы можете использовать super.

jonrsharpe 08.05.2019 09:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы используете Python 3, используйте super:

class A:
    def talk(self):
        print('Hi from A-land!')

class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super().talk()

b = B()
b.talk()
b.pass_message()

Выход:

Hello from B-land!
Hi from A-land!

Вы можете сделать то же самое в Python 2, если вы наследуете от object и указываете параметры super:

class B(A):
    def talk(self):
        print('Hello from B-land!')

    def pass_message(self):
        super(B, self).talk()

b = B()
b.talk()
b.pass_message()

Выход:

Hello from B-land!
Hi from A-land!

Вы также можете вызвать метод, как если бы это была бесплатная функция:

A.talk(b)
B.talk(b)  # the same as b.talk()

Выход:

Hi from A-land!
Hello from B-land!

Спасибо за Ваш ответ. У меня есть несколько методов в производном классе и базовом классе с тем же именем. В зависимости от сценария мне нужно вызвать методы A или B.

PGS 08.05.2019 10:29

@Gopi: Похоже, вы выбрали плохой дизайн, и вам следует его переделать.

user2357112 supports Monica 08.05.2019 10:30

@ user2357112 вы правы. Работа с наследием. :(

PGS 08.05.2019 10:34

@Gopi Как это связано с моим ответом?

gmds 08.05.2019 10:34

@gmds Я имел в виду, что у меня есть несколько переопределенных методов в дочернем классе. Я не могу создавать такие методы, как pass_message, чтобы все вызывали методы базового класса.

PGS 08.05.2019 10:38

@Gopi Тогда используйте третье предложение ...?

gmds 08.05.2019 10:46

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

Другие вопросы по теме