Cryptic python错误'classobj'对象没有属性'__getitem__'。我为什么要这个?

时间:2014-10-07 02:07:02

标签: class python-2.7 object types instantiation

我真的希望我能在这里更具体,但我已经阅读了相关问题,但这些问题似乎与我在这里遇到的问题无关,而且我对我遇到的问题一无所知。这是一个家庭作业,所以我犹豫是否要为程序提供所有代码,这里是一个精简版本。编译它,您将看到问题。

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')形式的列表(必须在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__'

为什么会这样?!

2 个答案:

答案 0 :(得分:1)

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

换句话说,请勿使用:

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

使用:

print Ordering((('A', 'B'), ('C', 'B'), ('D', 'A')))

这会在代码的深处产生另一个错误,但由于这是一个家庭作业,我会让你考虑一下这个错误。

如何使用__getitem__

作为一个最小的例子,这是一个通过__getitem__返回方块的类:

class HasItems(object):
    def __getitem__(self, key):
        return key**2

在操作中,它看起来像这样:

>>> a = HasItems()
>>> a[4]
16

注意方括号。

答案 1 :(得分:0)

回答“这是为什么?”

您的演示代码不完整(参考上面的评论),但 .__getitem__ 方法的问题显然与print对象的声明有关(由于其他原因确实无法响应回复被调用.__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']