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