5

「自己」に角括弧が使用されているコードに出くわしました。私はこの表記法に慣れておらず、自分が書いたものではないソース コードを理解しようとしているので、ここでどのような種類のオブジェクトが処理されているのかを理解するのが難しくなっています。

私が遭遇した例は、こちらの 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

__getitem__角かっこは、「 (または__setitem__)メソッドを呼び出す」というPythonの言い方です。

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

selfあなたの場合、との間には何の違いもありません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 に答える