包装对象的最简单方法是什么,以使包装器__call__调用包装对象__getItem__方法



考虑以下代码段:

dikt =  {
  "City": "Denver",
  "State": "Colorado",
  "Street": "123 Nowhere St."
}
kal = wrap(dikt)
assert(kal("City") == dikt["City"])
assert(kal("State") == dikt["State"])

实现wrap函数的最简单方法是什么?我们希望包装器的__call__方法调用包装对象__getitem__方法。

在直接的情况下简单就是实现基本的包装类别,该类别在这些术语中定义了 __call__

class wrap:
    def __init__(self, mapping):
       self.mapping = mapping
    def __call__(self, x):
        return self.mapping[x]

略短(至少在cpython上,稍快地呼叫(,但是使用闭合的功能工厂较少,可配置/可检查/可扩展是:

def wrap(mapping):
    def wrapped(x):
        return mapping[x]
    return wrapped

最后,最简单的(但最不配合(,直接返回绑定的 __getitem__

def wrap(mapping):
    return mapping.__getitem__

或使用现有工具将绑定到C(无论如何还是在CPYTHON上(:

from operator import attrgetter
wrap = attrgetter('__getitem__')

在这里没有对最终可呼叫的实际定义,您只是在绑定现有方法并返回。

最新更新