方括号适用于“;“自我”;用Python

方括号适用于“;“自我”;用Python,python,nlp,Python,Nlp,我遇到过一些代码,其中方括号用于“self”。我不熟悉这种表示法,当我试图了解不是我写的源代码时,很难理解这里处理的是什么类型的对象 我遇到的例子是Python的自然语言工具包。如果按住ctrl-Fself[context],您可以找到我的意思的示例 在没有更多上下文的情况下,可能无法准确地说出它是如何使用的,但下面是一个带有示例的片段: context = tuple(context) if (context + (word,) in self._ngrams) or (self._n ==

我遇到过一些代码,其中方括号用于“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:])
这个

允许迭代对象拥有的数据


被要求实施评估 自我[钥匙]。对于序列类型,接受的键应该是整数 和切片对象。注意否定的特殊解释 索引(如果类希望模拟序列类型)由
\uuuu getitem\uuuuu()
方法。如果键的类型不合适,可能会引发TypeError;如果值位于 顺序(在对负值进行任何特殊解释之后), 应提升索引器。对于映射类型,如果缺少键(不是 在容器中),应引发KeyError


self
只是一个标识符,因此这与在任何其他对象上执行
[]
相同。为了让它工作,
self
必须实现由方括号调用的“神奇方法”

例如

现在你可以做了

container = OneItemContainer("ham")
print(container[0])  # will print ham
但是没有理由不可以在方法中使用
[]

    # on the previous class
    def __repr__(self):
        return "OneItemContainer(%r)" % self[0]

方括号是python表示“调用
\uuuu getitem\uuuuuu
(或
\uuuuuu setitem\uuuuu
)方法”的方式


在您的情况下,
self
a
之间没有什么不同。事实上,在类的方法中,
self
没有什么特别之处。传递给方法的第一个参数是该类的实例,但您可以根据需要调用该参数
self
只是一个(非常推荐的)惯例。

我可以完整地向您推荐它吗?是的,从上到下。@Phantom——这是个好建议。我觉得我甚至应该这样做。(我很确定我读过整本书,但从来没有一次读过全部内容)。@mgilson可悲的是,我从来没有看到过一个问题涉及到那一页。所以我仍然不知道人们是不理解它,还是不读它。有些人在读了140个字符后就停止阅读:)@gnibler和写140行函数一样?
container = OneItemContainer("ham")
print(container[0])  # will print ham
    # on the previous class
    def __repr__(self):
        return "OneItemContainer(%r)" % self[0]
x = a[...]  #call a.__getitem__(...)
a[...] = x  #call a.__setitem__(...)
del a[...]  #call a.__delitem__(...)