Доступ к методу родительского класса через дочерний экземпляр

#python

#python

Вопрос:

У меня есть следующий код:

 class Organ():
    def __init__(self, organ_name, organ_weight):
        self.organ_name = organ_name
        self.organ_weight = organ_weight
    
    def __repr__(self):
        return "The {organ}'s weight is {weight}"
        .format(organ=self.organ_name, weight = self.organ_weight) 

class Heart(Organ):
    def __init__(self, heart_weight):
        self.heart_weight_grams = heart_weight
        super().__init__(__class__.__name__, self.heart_weight_grams)
    
    def __repr__(self):
        return "My heart's weight is {weight} grams"
        .format(weight=self.heart_weight_grams)

my_heart = Heart(200)
print(my_heart) #returns "My heart's weight is 200 grams"
  

my_heart Как мне получить доступ к методу метода родительского класса из моего дочернего экземпляра __repr__() ?

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

1. что именно вы имеете в виду «из моего дочернего экземпляра»?

Ответ №1:

Чтобы получить доступ к родительскому классу из дочернего, используйте super() , т.Е.: super().__repr__() но здесь вам это не нужно, на самом деле вы можете не heart_weight_grams использовать атрибут, потому что он такой же, как organ_weight и в родительском

Если у вас больше атрибутов в Heart классе, вы можете вызвать __repr__ parent и собрать дополнительную информацию из дочернего класса

 class Organ:
    def __init__(self, organ_name, organ_weight):
        self.organ_name = organ_name
        self.organ_weight = organ_weight

    def __repr__(self):
        return "The {organ}'s weight is {weight}".format(organ=self.organ_name, weight=self.organ_weight)
        # return f"The {self.organ_name}'s weight is {self.organ_weight}" # shorter 
    
class Heart(Organ):
    def __init__(self, heart_weight, hearbeat=60):
        super(Heart, self).__init__("heart", heart_weight)
        self.hearbeat = hearbeat

    def __repr__(self):
        return super().__repr__()   f" and beats at {self.hearbeat}"

my_heart = Heart(200)
print(my_heart)  # The Heart's weight is 200
  

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

1. извините, архитектура класса была задана в соответствии с моими инструкциями по назначению. В моем задании мне было поручено добавить метод repr как для органа, так и для сердца, а также определенные атрибуты для органа и сердца. Но для моего первоначального вопроса, как мне получить доступ к родительскому методу repr из моего дочернего экземпляра?

2. Я бы не стал делать : __class__.__name__ . Если это необходимо, имя должно быть явным атрибутом. Полагаться на само имя класса — плохая практика. Вы должны иметь право изменять имя класса, не нарушая что-то подобное.

3. @CrazyCoder, как я уже писал super().__repr__()

4. @CrazyCoder Смотри, я добавил дочерний элемент, добавляющий информацию в родительский репозиторий

Ответ №2:

Когда вы наследуете класс, вы можете получить доступ к родительским функциям с помощью super . Просто используйте super().__repr__() для доступа к функции.

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

1. придирка: super не является ключевым словом