#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
Аргумент). Это совсем другой синтаксис.
И опять же, гораздо разумнее давать методам разные имена, а не переопределять их.