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()
在实例上调用函数是非常简单的。我将添加一个示例。