Цель
Я пытаюсь создать тренировочный скрипт, в котором хранится меню, в которое можно добавлять новые элементы.Это такие вещи, как «анимация битвы», «скорость текста» или «субтитры».И меню будет распечатывать все свои элементы, как это (обратите внимание, что расстояние для всех элементов настроено так, чтобы соответствовать наибольшему)
| 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 вместо целых?
Возможно, я могувыяснить другой способ структурирования программы, чтобы избежать этого.Но это всего лишь сценарий практики.Я просто очень хочу знать, что происходит, чтобы создать эту ошибку.