#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. Я думал о том же, но просто хотел знать, возможно ли это. Очень точный и короткий ответ. Спасибо.