Как переопределить атрибут в базовом классе Python3, чтобы последующие операции оставались неизменными verywhere?

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

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

Вопрос:

У меня есть вариант использования, когда мне нужно переопределить один атрибут в инициализации базового класса, но операции после этого (путем использования этого атрибута) остаются прежними.

 class Person:
    def __init__(self, name, phone, record_file = None):
        self.name = name
        self.phone = phone
        if self.record_file:
            self.contents = json.load(open(self.record_file))
        else:
            self.contents = {'person_specific_details': details}
            
        #### Do some operations with self.contents

class Teenager(Person):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        
        # If self.record_file is None:
        # self.contents = new for Teenager
        self.contents = {'teenager_specific_details': teenager_details}
        # But further operations remains the same (#### Do some operations with self.contents)
t = Teenager(phone='xxxxxx', name='XXXXXXX')
 

Я не могу правильно его выполнить. Кто-нибудь может помочь?

Ответ №1:

Ваша основная проблема в том, что вы хотите изменить промежуточное значение в Person.__init__ , которое не будет работать. Но вы могли бы создать необязательный аргумент для contents и просто использовать его вместо параметра по умолчанию. Вот так:

 class Person:
    def __init__(self, name, phone, record_file=None, contents=None):
        self.name = name
        self.phone = phone
        if record_file:
            with open(record_file) as fp:
                self.contents = json.load(fp)
        else:
            if contents:  # can be utilized by other subclasses
                self.contents = contents
            else:
                self.contents = {"person_specific_details": details}

        #### Do some operations with self.contents


class Teenager(Person):
    def __init__(self, **kwargs):
        contents = {"teenager_specific_details": teenager_details}
        super().__init__(contents=contents, **kwargs)


t = Teenager(phone="xxxxxx", name="XXXXXXX")
 

Таким образом, вы можете передать Teenager конкретное содержимое в базовую инициализацию, и она может продолжить работу с этим.

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

1. Я думал о том же, но просто хотел знать, возможно ли это. Очень точный и короткий ответ. Спасибо.