目标 我正在尝试创建一个练习脚本,它存储一个可以添加新项目的菜单。 这些项目是像“战斗动画”,“文字速度”,或“字幕”。 菜单会像这样打印出所有的项目 (请注意,所有项目的间距都已调整为适合最大的项目)
| 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 |
图2
Menu
是一个类,用于存储菜单项并调整它们的间距值,以便它们像图1一样打印。你知道吗
我的代码
此代码被缩减为仅显示可再现的错误。不包括值列表(黑色、蓝色、红色、绿色等)。
#!/usr/bin/envPython3
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的类属性(即int)解释为MenuItem本身的类实例。
至少我是这样解释错误的。
这个错误的奇怪之处在于,只有当Menu类的方法调用它内部存储的MenuItem实例上的MenuItem方法时,才会发生这种情况。
如前所述,当MenuItem类是唯一定义和使用的类时,不会发生这些错误。
(另外,MenuItem是定义为Menu中的类还是定义为Menu之前的单独类也无关紧要。同样的错误也会发生)
我的问题
为什么python将f_menuItem.printsize
和self.printsize
解释为MenuItems而不是int?
我可能会想出一种不同的方法来构造程序来避免这种情况。但这只是一个练习脚本。我只是想知道是什么导致了这个错误。你知道吗
您的问题在addItem()中,特别是if语句的elif分支中,该分支包含以下行:
self.width = f_menuItem
这会损坏自身宽度在addIem的第一个调用中将其从int更改为MenuItem。因此,当第二次调用addItem时,比较就失败了。你知道吗相关问题 更多 >
编程相关推荐