2

このソリューションを実装することになったコンテキストを説明するのは簡単ではないため、これは非常に不自然な例です。ただし、この特定の特異性が発生する理由を誰かが答えることができれば、私は感謝します.

例:

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem'
        return dict.__getitem__(name)

class B(object):
    def __init__(self):
        self._a = A()
        setattr(self, '__getitem__', self._a.__getitem__) 

b = B()
c = b['a']

これは以下を出力します:

c = b['a']
TypeError: 'B' object is unsubscriptable

これを行うのは奇妙な方法ですが (明らかにサブクラス化する方がより論理的です)、明示的に設定したメソッドが見つからないのはなぜですか?

私がこれを行う場合:

dir(b)

私はこれを得る:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a']

などの他の方法でも同じ問題が発生し__iter__ます。機能するこのメソッドを明示的に定義することについてはどうですか?

4

2 に答える 2

7

ブラケットを使用する[]と、Python はクラスを検索します。クラスでメソッドを設定する必要があります。

適応したコードは次のとおりです。

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem!'
        return dict.__getitem__(self, name)

class B(object):
    def __init__(self):
        self._a = A()
        B.__getitem__ = self._a.__getitem__

b = B()
c = b['a']
于 2009-03-25T18:29:16.493 に答える
1

これは、特別なクラス メソッドをオンザフライでオーバーライドできないためです。

これに関するリファレンスを見つけることができませんでしたが、基本的にそれらはクラス メソッドであり、インスタンス メソッドにすることは許可されていないためです。

于 2009-03-25T18:19:25.877 に答える