0

なぜこれが起こっているのか、それを修正する方法がわかりません。私はPythonが初めてで、助けていただければ幸いです。

class Sentence:
    def __init__(self, s):
        self.s= s
        x=s[:-1]
        self.L= list(x.split())
    def __getitem__(self,idx):
        return (self.L[idx])


s= Sentence('What a beautiful morning!')

getitem(s, 2)

NameError: 名前 'getitem' が定義されていません

4

2 に答える 2

2

ドキュメントから:

object.__getitem__(self, key)

の評価を実装するために呼び出されますself[key]。...

を実装__getitem__すると、ブラケット表記を使用してアイテムを取得できます。

s[2]

または明示的に呼び出すことによって__getitem__(私はそれをしません):

s.__geitem__(2)
于 2013-06-05T00:15:59.023 に答える
1

Blender にはわかりやすい答えがありますが、その価値があるのは、あなたが次のように入力したことに気付きました:

getitem(s, 2)

次のようなことを考えていたようです。

def __getitem__(self, x):
                 |    |
        ---------     |
        |  ------------
        v  v
getitem(s, 2)

selfクラスのメソッドを定義して引数として渡す場合、そのクラスのインスタンス、つまりオブジェクトを として指定していることに注意してくださいself。つまり、self.s = s「このオブジェクトsをパラメーターsの値に設定する」と言っているのです。

self括弧内の引数の 1 つにはなりません。その引数は、括弧の外側の特別なものと考えることができます。

def __getitem__(self, x):
                 |    |
------------------    |
|             ---------
v             v
s.__getitem__(2)

繰り返しますが、Blender が言ったように、__getitem__()は特別な関数 (添え字の演算子オーバーライドのようなものです) であるため、直接呼び出すべきではありません。注意してください!

詳細については、この質問を参照してください。

于 2013-06-05T00:57:24.387 に答える