5

我遇到了一些在“self”上使用方括号的代码。我不熟悉这种表示法,并且由于我试图了解不是我编写的源代码,因此很难理解这里处理的是哪种对象。

我遇到的示例在 Python 的自然语言工具包。如果您 ctrl-F ,您可以找到我的意思的示例self[context]

如果没有更多上下文,可能无法准确说出它是如何使用的,但这里有一个带有示例的片段:

context = tuple(context)
if (context + (word,) in self._ngrams) or (self._n == 1):
     return self[context].prob(word)
else:
     return self._alpha(context) * self._backoff.prob(word, context[1:])
4

3 回答 3

6

方括号是 python 表达“调用__getitem__(或__setitem__)方法”的方式。

x = a[...]  #call a.__getitem__(...)
a[...] = x  #call a.__setitem__(...)
del a[...]  #call a.__delitem__(...)

self在您的情况下, and之间没有什么不同a。事实上,类的方法并没有什么特别之处self。传递给方法的第一个参数是类的一个实例,但您可以随意调用该参数。 self只是一个(非常强烈推荐的)约定。

于 2012-12-17T22:01:11.460 回答
3

self只是一个标识符,所以这与[]对任何其他对象的操作相同。为此,self必须实现__getitem__方括号调用的“魔术方法”。

例如

class OneItemContainer(object):
    def __init__(self, value):
        self.value = value

    def __getitem__(self, i):
        if i != 0:
            raise IndexError("this container can only hold one object")
        return self.value

现在你可以做

container = OneItemContainer("ham")
print(container[0])  # will print ham

但是没有理由不能[]在方法中使用:

    # on the previous class
    def __repr__(self):
        return "OneItemContainer(%r)" % self[0]
于 2012-12-17T22:00:44.667 回答
1

def __getitem__(self, item):
    return self._model[tuple(item)]

允许迭代对象拥有的数据。

object.__getitem__(self, key)
调用以实现对 self[key] 的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于 __getitem__()方法。如果 key 的类型不合适,可能会引发 TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发 IndexError。对于映射类型,如果缺少键(不在容器中),则应引发 KeyError。

http://www.python.org/dev/peps/pep-0234/

于 2012-12-17T22:00:25.847 回答