lar*_*sks 6 python introspection setattr
是否可以__getitem__使用setattr()?动态地将特殊方法分配给类实例?例如,如果我有这个:
class Example (object):
pass
Run Code Online (Sandbox Code Playgroud)
然后尝试这个:
>>> example = Example()
>>> setattr(example, '__getitem__', lambda x: 1)
Run Code Online (Sandbox Code Playgroud)
我明白了:
>>> example['something']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Example' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
但当然这很好用:
>>> example.__getitem__('something')
1
Run Code Online (Sandbox Code Playgroud)
这里显然有一些事情,我不明白Python如何为这类事情进行方法查找.是否必须在类上设置这些方法,而不是在实例上设置?
更新:
所以,我应该说清楚,我知道我可以在Example课堂上看到这一点...我希望有一种方法可以在每个实例中设置它们,但我到目前为止看到的共识是你不能这样做.
这里的问题是__getitem__()在类级别定义,而不是在实例级别定义:
>>> class Example (object):
... pass
...
>>> example = Example()
>>> setattr(Example, '__getitem__', lambda x, y: 1)
>>> example['something']
1
Run Code Online (Sandbox Code Playgroud)
如果您需要它是特定于实例的:
>>> 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2356 次 |
| 最近记录: |