Атрибут вложенного класса не распознается как int - PullRequest
0 голосов
/ 18 мая 2018

Цель
Я пытаюсь создать тренировочный скрипт, в котором хранится меню, в которое можно добавлять новые элементы.Это такие вещи, как «анимация битвы», «скорость текста» или «субтитры».И меню будет распечатывать все свои элементы, как это (обратите внимание, что расстояние для всех элементов настроено так, чтобы соответствовать наибольшему)

| border color |
| (black) blue red green |
| Text Speed |
| slow (medium) fast |
рис. 1

Мои методы
MenuItem сам по себе является классом.Он управляет содержимым пункта меню и хранит информацию о том, сколько места для настройки ему необходимо при печати.Этот класс отлично работает сам по себе.Если два вышеупомянутых элемента были созданы и напечатаны с использованием только методов класса MenuItem, они бы выглядели следующим образом: | border color |
| (black) blue red green |
| Text Speed |
| slow (medium) fast |
fig 2

Menu - это класс, который я создал для хранения пунктов меню и настройки их интервалов, чтобы они печатались, как показано на рисунке 1.

Мой код
Этот код был уменьшен, чтобы показать только воспроизводимую ошибку.Списки значений (черный, синий, красный, зеленый и т. Д.) Не включены.
#! / Usr / bin / env python3

class Menu(object):
    class MenuItem(object):
        def __init__(self, propertyTitle):
            self.title = propertyTitle
            self.printsize = (len(self.title)+4)

        def printMenuItem(self):
            f_indent = 2;
            f_title = ((' '*f_indent)+ self.title.ljust(self.printsize-f_indent))
            print('|',f_title ,'|',sep='')

    def __init__(self):
        self.width = 0;
        self.items = [];

    def addItem(self, pTitle):
        f_menuItem = Menu.MenuItem(pTitle)
        if(f_menuItem.printsize < self.width):
        #if(f_menuItem.printsize < 5):
            #adjusting padding on the smaller new menu item
            f_menuItem.printsize = self.width
        elif(f_menuItem.printsize > self.width):
        #elif(f_menuItem.printsize > 5):
            #adjusting padding on all past menu items to fit this new big item
            self.width = f_menuItem
            for x in self.items:
                x.printsize = self.width
        self.items.append(f_menuItem)
    def printMenu(self):
        for x in self.items:
            x.printMenuItem()

print()

property_1_title = "border color";
property_2_title = "text speed";

myMenu = Menu()
#myMenu.items.append(myBorderColor)
#myMenu.items.append(myTextSpeed)
myMenu.addItem(property_1_title);
myMenu.addItem(property_2_title);
myMenu.printMenu()

Проблема
Я получаю следующие ошибки:

line 20, in addItem
if(f_menuItem.printsize < self.width):
TypeError: '<' not supported between instances of 'int' and 'MenuItem'

line 24, in printMenuItem
f_title = ((' '*f_indent)+ self.f_title.ljust(self.printsize-f_indent))
TypeError: unsupported operand type(s) for -: 'MenuItem' and 'int'

По какой-то причине python интерпретирует атрибуты класса (которые являются целыми числами) MenuItem как экземпляры класса самого MenuItem.По крайней мере, так я истолковал ошибки.
Странная часть этой ошибки заключается в том, что это происходит только тогда, когда методы класса Menu вызывают методы MenuItem для экземпляров MenuItem, которые он хранит внутри.
Как я уже упоминал ранее, этиошибки не происходят, когда класс MenuItem является единственным определенным и используемым классом.
(также не имеет значения, определен ли MenuItem как класс в Menu или если он определен как отдельный класс перед Menu. Те же ошибкислучается)

Мой вопрос к вам

Почему Python интерпретирует f_menuItem.printsize и self.printsize как MenuItems вместо целых?
Возможно, я могувыяснить другой способ структурирования программы, чтобы избежать этого.Но это всего лишь сценарий практики.Я просто очень хочу знать, что происходит, чтобы создать эту ошибку.

1 Ответ

0 голосов
/ 18 мая 2018

Ваша проблема в addItem (), а именно в ветви elif оператора if, которая содержит строку: self.width = f_menuItem это повреждает self.width, изменяя его с int на MenuItem при первом вызове addIem.Поэтому, когда addItem вызывается во второй раз, сравнение взрывается.

...