(python)嵌套类属性未被识别为int

时间:2018-05-18 02:14:30

标签: python class typeerror python-3.6 class-attributes

目标
我正在尝试创建一个练习脚本,该脚本存储可以添加新项目的菜单。 这些项目类似于“战斗动画”,“文本速度”或“字幕”。 菜单会打印出这样的所有项目 (注意调整所有项目的间距以适应最大的间距)

| 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 / 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的类属性(即int)解释为MenuItem本身的类实例。 至少我是如何解释这些错误的 关于这个错误的奇怪之处在于,这只发生在Menu类的方法在内部存储的MenuItem实例上调用MenuItem方法时。 正如我之前提到的,当MenuItem类是唯一定义和使用的类时,不会发生这些错误 (如果将MenuItem定义为Menu中的类或者在Menu之前将其定义为单独的类,则无关紧要。发生相同的错误)

我的问题

为什么python将f_menuItem.printsizeself.printsize解释为MenuItem而不是整数?
我可能想出一种不同的方法来构建程序以避免这种情况。但它只是一个练习脚本。我真的很想知道发生这个错误的原因。

1 个答案:

答案 0 :(得分:2)

你的问题是在addItem()中特别是if语句的elif分支,它包含行:self.width = f_menuItem这会破坏self.width,在addIem的第一次调用中将它从int更改为MenuItem。因此,当第二次调用addItem时,比较会爆炸。