#python #inheritance #attributes #runtime-error #subclass
#питон #наследование #атрибуты #время выполнения-ошибка #подкласс
Вопрос:
Я пытаюсь научиться лучше использовать классы, но super() действительно заводит меня в тупик. Почему super() не выполняет поиск в классе свойств, чтобы найти атрибут «foo»? На мой взгляд, это должно быть печатью числа 10, но явно это не так, и я понятия не имею, где мне не хватает некоторого понимания. Я запускаю python 3x (я упоминаю об этом, так как знаю, что super() ведет себя по-другому в 2x). Я пытался просто использовать super()__init__()
, я пытался не помещать super()
вызов в класс свойств.
class properties: def __init__(self): super(properties, self).__init__() self.foo = 10 class losses(properties): def __init__(self): super(losses, self).__init__() self.bar = 5 def foobar(self): print(super().foo self.bar) test = losses() test.foobar()
Независимо от того, какой будет результат, всегда:
AttributeError: 'super' object has no attribute 'foo'
Комментарии:
1.
super
выполняет поиск класса и классов в порядке разрешения метода . Вы просто хотитеprint(self.foo self.bar)
, потому что вам нужен атрибут экземпляра2. Также, поскольку
properties
класс не имеет никакого суперкласса;super(properties, self).__init__()
не требуется. Также синтаксис изменился в Python 3.0: вы можете просто использоватьsuper().__init__()
вместоsuper(Child, self).__init__()
.3. Ах, спасибо, в этом есть большой смысл. Допустим, у меня был другой атрибут, вызванный
foo
вlosses
классе, можно ли было бы вызватьfoo
его вproperties
классе, или это просто плохая практика кодирования, и ее вообще следует избегать?4. @K450 не совсем так. У него действительно есть суперкласс, у каждого класса есть суперкласс. Но что еще более важно, этот шаблон полностью приемлем, если вы разрабатываете свои классы для совместного множественного наследования
5. @shirtless_llama опять же, эти свойства вообще не принадлежат классам , они являются атрибутами экземпляра .