Понимание классов, наследования и супер()

#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 опять же, эти свойства вообще не принадлежат классам , они являются атрибутами экземпляра .