Python — Как я могу вызывать методы суперкласса из экземпляра дочернего класса?

#python #class #inheritance #overriding #super

#python #класс #наследование #переопределение #супер

Вопрос:

Когда дочерний класс имеет метод с тем же именем, что и метод в родительском классе, метод дочернего класса переопределяет метод родительского класса.

В определении дочернего класса можно получить доступ к методу родительского класса с помощью super() .

Тогда возможно ли получить доступ к методу родительского класса из экземпляра дочернего класса?

 class Person:
    def print(self):
        print("Message from Person")

class Student(Person):
    def print(self):
        print("Message from Student")

s = Student()
# Method of Student Class Instance
s.print()  # Output: "Message from Student"

# I want to call method "print" of Person
# from student Instance
# How can I call it?
s.super().print()  # ERROR
super(s).print()  # ERROR
 

Комментарии:

1. Если вы хотите, чтобы оба метода были легко доступны, зачем их переопределять? Просто дайте им разные имена.

2. можете ли вы вставить ошибку, чтобы мы лучше понимали?

3. @mapf Спасибо за вашу помощь. Я знаю, что это можно легко решить, как вы сказали. Но мне просто интересно, возможно ли это или нет. Спасибо

Ответ №1:

Если нет абсолютно никакого способа получить доступ к родительскому классу каким-либо другим способом, я думаю, вы могли бы это сделать, но я бы категорически не рекомендовал это:

 class Person:
    def print(self):
        print("Message from Person")


class Student(Person):
    def print(self):
        print("Message from Student")


s = Student()
# Method of Student Class Instance
s.print()  # Output: "Message from Student"
s.__class__.__base__.print(s.__class__.__base__)  # Output: "Message from Person"
 

Вы должны понимать, что это супер хакерство, и что вы вызываете не метод экземпляра, как в случае с s.print() , а вызываете метод неустановленного класса, метод, который не является classmethod (или staticmethod , если на то пошло), и передаете ему класс в качестве аргумента(т.е. self Аргумент). Это совсем другой синтаксис.

И опять же, гораздо разумнее давать методам разные имена, а не переопределять их.