Python 使用setattr()设置特殊方法

Python 使用setattr()设置特殊方法,python,introspection,setattr,Python,Introspection,Setattr,是否可以使用setattr()动态地将特殊方法(如\uu getitem\uu)分配给类实例?例如,如果我有: class Example (object): pass 然后试试这个: >>> example = Example() >>> setattr(example, '__getitem__', lambda x: 1) 我明白了: >>> example['something'] Traceback (most rece

是否可以使用
setattr()
动态地将特殊方法(如
\uu getitem\uu
)分配给类实例?例如,如果我有:

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__'
很明显,这里发生了一些我不理解的事情,关于Python方法如何查找这类事情。这些方法是否必须在类上而不是在实例上设置

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


因此,我应该在
示例
类中清楚地说明这一点……我希望有一种方法可以为每个实例设置它们,但到目前为止,我的共识是您无法做到这一点。

这里的问题是
\uu getitem\uuuuuuu()
是在类级别定义的,而不是在实例级别:

>>> 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

你有没有试着修补类,而不是实例

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

嗯……但这会影响
Example
的所有实例,而不仅仅是特定实例。回到绘图板上来吧,我想。@larsks让
\uuuu getitem\uuuu()
在实例上调用函数是非常简单的。我将添加一个示例。