Как правильно наследовать метод от родительского класса без изменения родительского класса?

#python #python-3.x #class #oop #inheritance

#python #python-3.x #класс #ооп #наследование

Вопрос:

Я получил этот вопрос от моего друга, который является студентом первого курса CS.

Вопрос: Реализуйте дизайн Xiaomi классов и Huawei классов, которые наследуются от SmartPhone class, чтобы следующий код генерировал вывод ниже:

Данный код:

 class SmartPhone:
     def __init__(self, name):
         self.name = name
     def check(self):
          print(“The phone is working properly”)

     #Write your code here

f = Xiaomi(“Redmi Note 8”)
c = Huawei(“Y9”)
f.check()
print(“=========================”)
c.check()
print(“=========================”)
  

Вывод должен быть:

 This is Xiaomi Redmi Note 8
The phone is working properly
=========================
This is Huawei Y9
The phone is working properly
=========================
  

Мое решение:

 class SmartPhone:
     def __init__(self, name):
         self.name = name
     def check(self):
         print(self.__str__()) #changing parent class
         print('The phone is working properly')

#Write your code here
class Xiaomi(SmartPhone):
    def __str__(self):
        return f'This is Xiaomi {self.name}'
class Huawei(SmartPhone):
    def __str__(self):
        return f'This is Huawei {self.name}'


f = Xiaomi('“Redmi Note 8”')
c = Huawei('“Y9”')
f.check()
print('=========================')
c.check()
print('=========================')
  

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

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

1. def check(self): print('This is Xiaomi ...'); super().check() …? Переопределите check метод в каждом дочернем элементе, чтобы вывести это дополнительное сообщение перед вызовом исходного родительского метода …?

2. Понял. Большое спасибо. Я забыл вызвать суперфункцию.

Ответ №1:

Что вам нужно, так это реализовать check метод, вызывающий родительский метод:

 class SmartPhone:
     def __init__(self, name):
         self.name = name

     def check(self):
          print(“The phone is working properly”)


#Write your code here
class Xiaomi(SmartPhone):
    def check(self):
        print(f"This is Xiaomi {self.name}")
        super().check()


class Huawei(SmartPhone):
    def check(self):
        print(f"This is Huawei {self.name}")
        super().check()


f = Xiaomi(“Redmi Note 8”)
c = Huawei(“Y9”)
f.check()
print(“=========================”)
c.check()
print(“=========================”)
  

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

1. Понял. Большое спасибо.

Ответ №2:

Вам нужно вызвать super при переопределении метода из суперкласса. Это значит,

 def check(self):
    print(f"This is Xiaomi {self.name}")
    super.check()
    // codes for overriding