Прошу прощения за довольно расплывчатую формулировку вопроса. Я попытаюсь пояснить, что я имею в виду, на простом примере ниже. У меня есть класс, который я хочу использовать в качестве базы для других классов:
class parent:
def __init__(self, constant):
self.constant = constant
def addconstant(self, number):
return self.constant + number
Параметр self.constant
имеет первостепенное значение для удобства использования класса, так как от него зависит метод addconstant
. Поэтому метод __init__
заботится о том, чтобы заставить пользователя определить значение этого параметра. Все идет нормально.
Теперь я определяю дочерний класс следующим образом:
class child(parent):
def __init__(self):
pass
Ничто не мешает мне создать экземпляр этого класса, но когда я попытаюсь использовать addconstant
, он явно вылетит.
b = child()
b.addconstant(5)
AttributeError: 'child' object has no attribute 'constant'
Почему Python позволяет это делать!? Я чувствую, что Python слишком гибок и каким-то образом нарушает суть ООП и инкапсуляции. Если я хочу расширить класс, чтобы воспользоваться преимуществами наследования, я должен быть осторожен и знать некоторые детали реализации класса. В этом случае я должен знать, что принуждение пользователя к установке константы параметра constant
имеет основополагающее значение, чтобы не нарушать удобство использования класса. Не нарушает ли это как-то принцип инкапсуляции?
constant
; вызовparent.__init__
делает. - person chepner   schedule 19.02.2021