7

__getitem__を使用してクラス インスタンスになどの特別なメソッドを動的に割り当てることは可能setattr()ですか? たとえば、これがある場合:

class Example (object):
    pass

そして、これを試してください:

>>> example = Example()
>>> setattr(example, '__getitem__', lambda x: 1)

私はこれを得る:

>>> example['something']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Example' object has no attribute '__getitem__'

しかしもちろん、これは問題なく動作します:

>>> example.__getitem__('something')
1

Pythonがこの種のメソッド検索をどのように行うかについて、私には理解できないことが明らかにここで起こっています。これらのメソッドは、インスタンスではなくクラスに設定する必要がありますか?

更新

したがって、クラスでこれを見ることができることを知っているよりも明確にする必要があります...インスタンスごとExampleに設定する方法があることを望んでいましたが、これまでに見たコンセンサスは、あなたはそれを行うことができないということです.

4

2 に答える 2

6

ここでの問題は__getitem__()、インスタンス レベルではなく、クラス レベルで定義されていることです。

>>> class Example (object):
...     pass
... 
>>> example = Example()
>>> setattr(Example, '__getitem__', lambda x, y: 1)
>>> example['something']
1

インスタンス固有にする必要がある場合:

>>> class Example(object):
...     def __getitem__(self, item):
...         return self._getitem(item)
... 
>>> example = Example()
>>> setattr(example, '_getitem', lambda x: 1)
>>> example['something']
1
>>> example2 = Example()
>>> setattr(example2, '_getitem', lambda x: 2)
>>> example['something']
1
>>> example2['something']
2
于 2012-05-07T14:59:56.093 に答える
0

インスタンスではなく、クラスにモンキーパッチを適用しようとしましたか?

>>> example = Example()
>>> setattr(Example, '__getitem__', lambda self,x: 1)
于 2012-05-07T15:00:19.047 に答える