【发布时间】:2019-09-15 09:58:13
【问题描述】:
我意识到没有get 方法的类自然就没有get 方法。将get 方法添加到实现__getitem__ [没有样板] 的类中的最佳方法是什么?
我试过了:
class Foo():
def __getitem__(self, item):
...
get = dict.get # TypeError
但是python抱怨:
TypeError: descriptor 'get' for 'dict' objects doesn't apply to 'Foo' object
显然collections.UserDict 可以使用,但我希望是懒惰的(因为分辨率很昂贵)并且不填充项目数据,直到它被访问(并通过Foo 对象上的键缓存)。
想法?
【问题讨论】:
-
写方法?
-
您提到希望您的代码懒惰并避免昂贵的工作,但目前还不清楚您如何才能懒惰地为类字典类实现
get。您希望跳过的具体工作是什么? -
您似乎还想使用
collections.abc.Mapping抽象基类的 mixin 方法。如果你使用它作为你自己类型的基类,你只需要实现__getitem__、__len__和__iter__,它就会给你剩下的所有(只读)映射API。如果你想可变,那就从MutableMapping继承,并添加__setitem__和__delitem__。 -
由于您的类不是
dict(或其中的子类),您需要def get(self, <args...>):并定义它的含义/作用。