隐晦的python错误';classobj';对象没有属性'__getitem';。为什么我会得到这个?

隐晦的python错误';classobj';对象没有属性'__getitem';。为什么我会得到这个?,class,python-2.7,object,types,instantiation,Class,Python 2.7,Object,Types,Instantiation,我真的希望我能在这里说得更具体一些,但我已经通读了相关的问题,其中似乎没有一个与我在这里遇到的问题相关,我对我正在经历的问题没有任何理解。这是一个家庭作业,所以我很犹豫是否要把我所有的程序代码都放在这里,这是一个精简版。编译此文件,您将看到问题所在 import copy class Ordering: def __init__(self, tuples): self.pairs = copy.deepcopy(tuples) self.sorted

我真的希望我能在这里说得更具体一些,但我已经通读了相关的问题,其中似乎没有一个与我在这里遇到的问题相关,我对我正在经历的问题没有任何理解。这是一个家庭作业,所以我很犹豫是否要把我所有的程序代码都放在这里,这是一个精简版。编译此文件,您将看到问题所在

import copy

class Ordering:

    def __init__(self, tuples):

        self.pairs = copy.deepcopy(tuples)
        self.sorted = []
        self.unsorted = []

        for x in self.pairs:
            self.addUnsorted(left(x))
            self.addUnsorted(right(x))

    def addUnsorted(self, item):

        isPresent = False

        for x in self.unsorted:
            if x == item:
                isPresent = True

        if isPresent == False:
            self.unsorted.append(left(item))
在这里,我创建了一个类Ordering,它采用[('a','B'),('C','B'),('D','a')]的形式(其中a必须在B之前,C必须在B之前,等等)的列表,并且应该以部分顺序的形式返回它。我正在调试我的代码,看看它是否能正常工作,但由于返回的错误消息,我还无法调试

当我在终端中输入以下内容时:

print Ordering[('A', 'B'), ('C', 'B'), ('D', 'A')]
我返回以下错误消息:

Traceback (most recent call last): File "<stdin>", line 1, in (module) Type Error: 'classobj' object has no attribute '__getitem__'
Traceback(最近一次调用last):文件“”,第1行,在(模块)类型错误中:“classobj”对象没有属性“\uuu getitem\uuuu”

这是为什么

要访问列表中的元素,请使用方括号。要实例化类,请使用parens

换句话说,不要使用:

print Ordering[('A', 'B'), ('C', 'B'), ('D', 'A')]
使用:

这将在代码的更深处产生另一个错误,但是,由于这是一个家庭作业,我将让您稍微考虑一下这个问题

如何使用
\uuu getitem\uuu
: 下面是一个通过
\uuu getitem\uuu
返回正方形的类:

class HasItems(object):
    def __getitem__(self, key):
        return key**2
在操作中,它看起来如下所示:

>>> a = HasItems()
>>> a[4]
16
注意方括号。

回答“这是为什么?” 您的演示代码不完整(请参阅上面的注释),但是
\uuuuuu getitem\uuuuuuuuuuuuuuuuuuuuuu>方法的问题显然与
打印对象的语句有关(由于其他原因,该语句无法响应对调用的
\uuuuuuuGetItem\uuuuuuuuuuuuuuuuuuu
方法进行应答的请求)而不是课堂本身

>>> aList = [ ('A','B'), ('C','D'), ('E','F')]       # the stated format of input
>>> aList                                            # validated to be a list
[('A', 'B'), ('C', 'D'), ('E', 'F')]
>>> type( aList )                                    # cross-validated
<type 'list'>
>>> for x in aList:                                  # iterator over members
...     print x, type(  x )                          # show value and type
...     left( x )                                    # request as in demo-code
...
('A', 'B') <type 'tuple'>
Traceback (most recent call last):                   <<< demo-code does not have it
  File "<stdin>", line 3, in <module>
NameError: name 'left' is not defined


>>> dir( Ordering )                                  # .__getitem__ method missing
[ '__doc__', '__init__', '__module__', 'addUnsorted']


>>> dir( aList[0] )                                  # .__getitem__ method present
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
 '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
 '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 'count', 'index']
aList=[('A','B'),('C','D'),('E','F')]#输入的规定格式 >>>已验证为列表的列表 [('A','B'),('C','D'),('E','F')] >>>类型(aList)#交叉验证 >>>对于列表中的x:#成员的迭代器 ... 打印x,键入(x)#显示值和类型 ... 左(x)#请求如演示代码所示 ... (‘A’、‘B’) 回溯(最近一次调用):>>dir(排序)#.uu getitem_uuu方法缺失 [''.'文档'.''.'初始化'.'.'模块'.''.'添加未排序'] >>>dir(aList[0])#.uuu getitem_uuu方法存在 [“添加”、“类”、“包含”、“delattr”、“文档”、“eq”, “\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu getattribute\uuuuuuuuuuuuu, "获取切片","gt","哈希","初始化","iter","le","len",, "新","减少","减少","增加","新","减少","减少",, "报告","rmul","setattr","大小","str","子类钩子",, '计数','索引']
您可能已经注意到,您的演示代码使用了未定义的函数
left()
right()
,这些函数都是快速响应的关键。我的错误是,我忘了在课堂上用括号括起我的论点。同样感谢getitem的示例,这很有意义。
>>> aList = [ ('A','B'), ('C','D'), ('E','F')]       # the stated format of input
>>> aList                                            # validated to be a list
[('A', 'B'), ('C', 'D'), ('E', 'F')]
>>> type( aList )                                    # cross-validated
<type 'list'>
>>> for x in aList:                                  # iterator over members
...     print x, type(  x )                          # show value and type
...     left( x )                                    # request as in demo-code
...
('A', 'B') <type 'tuple'>
Traceback (most recent call last):                   <<< demo-code does not have it
  File "<stdin>", line 3, in <module>
NameError: name 'left' is not defined


>>> dir( Ordering )                                  # .__getitem__ method missing
[ '__doc__', '__init__', '__module__', 'addUnsorted']


>>> dir( aList[0] )                                  # .__getitem__ method present
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
 '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
 '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
 'count', 'index']