Ошибка Python с атрибутами и наследованием

#python #inheritance

#python #наследование

Вопрос:

У меня ошибка при использовании Python, но я не знаю, как ее исправить. У меня есть несколько классов, класс «Приложение», «Контроллер» и «Консоль». Консоль наследуется от контроллера, а контроллер наследуется от приложения.

консоль класса (контроллер): …

контроллер класса (приложение): …

класс App(): …

Контроллер класса имеет атрибут «команды», это список. Консоль класса имеет функцию «write_command», которая вызывает функцию контроллера.

Это класс «Консоль»

 class Console(Controller):

def __new__(cls, *args, **kwargs):
    return super(Console, cls).__new__(cls)

def __init__(self):
    print('Init the console')

def __del__(self):
    print('Destructor console')

def write_command(self):
    command = input('Please write something: ')

    if self.exit_from_console(command):
        print('Bye')

    else:
        if self.is_valid_command(command):
            print(super().do_something(0, command))
        else:
            print('Que vergüenza, estoy algo confundido')
        self.write_command()

def is_valid_command(self, command):
    # Check if command is valid
    return super().validate_command(command)

@staticmethod
def exit_from_console(command):
    if command == 'exit':
        return True
    else:
        return False
 

Это код класса контроллера:

 class Controller(App):

def __new__(cls, *args, **kwargs):
    return super(Controller, cls).__new__(cls)

def __init__(self):

    # Temp Command list. Get it from DB
    self.commands = [('caminar', 'walk', 1),
                     ('correr', 'run', 2),
                     ('saltar', 'jump', 3),
                     ('saludar', 'hello', 4),
                     ('', '', 5),
                     ('', '', 6),
                     ('', '', 7)
                     ]

    self.users = ['0', 'System', 'Scenary']

    print('Init de controller')

def validate_command(self, command):
    # Search in local data base for command
    found = False
    the_commands = self.commands

    for i in the_commands:
        if i[0] == command.lower() or i[1] == command.lower():
            found = True
            break

    return found

def get_commands(self):
    pass

def do_something(self, user, command):
    for item in self.commands:
        if item[0] == command.lower or item[1] == command.lower:
            return super().play(user, item[2])

    return 'Nothing'

def get_commands(self):
    return self.commands
 

И класс App, имеет функцию play()

Ошибка:

Ошибка атрибута: объект ‘Console’ не имеет атрибута ‘commands’

Это правда, но я использую этот атрибут не из консоли, а из класса контроллера, в котором он определен.

Спасибо!

PD: Прошу прощения, если это глупо, но я новичок в Python.

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

1. Можете ли вы указать, как вы создаете экземпляр объекта и какую функцию вы вызываете?

2. и полная трассировка стека также была бы хороша

3. Вы не вызывали Controller.__init__ из Console.__init__ .

Ответ №1:

Вы не вызвали функцию инициализации для суперкласса, который вы должны вызвать:

 super(Console, self).__init__()