如果模拟dict,在python中为_ugetItem__;()子类化对象的正确方法

如果模拟dict,在python中为_ugetItem__;()子类化对象的正确方法,python,python-2.7,Python,Python 2.7,子类化对象的正确方法是什么?\uuu getitem\uuuu(),但返回默认行为?我想让它看起来像是一个dict,对任何可能的键都动态地(但一致地)运行 class MyObj(object): """MyObj()[k] returns 1 for any key k that ends in '_q', default item lookup behavior otherwise""" mypattern = re.compile(r'_q$') de

子类化
对象的正确方法是什么?\uuu getitem\uuuu()
,但返回默认行为?我想让它看起来像是一个dict,对任何可能的键都动态地(但一致地)运行

class MyObj(object):
    """MyObj()[k] returns 1 for any key k that ends in '_q',
       default item lookup behavior otherwise"""
    mypattern = re.compile(r'_q$')
    def __getitem__(self, k):
        if self.mypattern.match(k):
            return 1
        else:
            ???

我尝试调用
return super(TFConverter,self)。\uuu getitem\uuuuuuk(self)
它告诉我
AttributeError:'super'对象没有属性'\uuuu getitem\uuuuuuuuuuuuuuu'
,如果你想模拟一个类似
dict
的接口,当该项不存在时,你应该抛出一个
键错误,就像
dict
一样。当您的键是字符串时,往往会出现这种情况

def __getitem__(self, k):
    if self.mypattern.match(k):
        return 1
    else:
        raise KeyError("Key {} does not match pattern {}".format(k, self.mypattern))
如果希望对象像
列表
一样工作(通常情况下,如果它有整数键),则应引发
索引器

调用
super()<代码>\uuu getitem\uu
仅存在于支持订阅的对象上。因此,如果您想委托给一个超类的
\uu getitem\uu
实现,您必须确保您正在对定义它的东西进行子类化(例如
dict

另一个用例是在找不到键时返回默认值。例如,下面是对
collections.defaultdict
的纯Python解释(实际版本是用C编写的):


如果您希望模拟类似于
dict
的界面,那么当该项不存在时,您应该像
dict
一样发出
keyrerror
。当您的键是字符串时,往往会出现这种情况

def __getitem__(self, k):
    if self.mypattern.match(k):
        return 1
    else:
        raise KeyError("Key {} does not match pattern {}".format(k, self.mypattern))
如果希望对象像
列表
一样工作(通常情况下,如果它有整数键),则应引发
索引器

调用
super()<代码>\uuu getitem\uu
仅存在于支持订阅的对象上。因此,如果您想委托给一个超类的
\uu getitem\uu
实现,您必须确保您正在对定义它的东西进行子类化(例如
dict

另一个用例是在找不到键时返回默认值。例如,下面是对
collections.defaultdict
的纯Python解释(实际版本是用C编写的):


没有
对象。\uuu getitem\uu
。为了能够调用
\uuu getitem\uuu
的基类实现,您需要从实际具有基类的类继承。鉴于此,您的
super
调用将正常工作。

没有
对象。\uuuu getitem\uuuu
。为了能够调用
\uuu getitem\uuu
的基类实现,您需要从实际具有基类的类继承。有鉴于此,您的
super
调用将正常工作。

默认行为是引发一个错误,表示对象不支持项访问,这确实是您得到的。您所指的“默认项查找行为”到底是什么
MyObj
仅子类
object
,它没有要查找的项,也没有
x[i]
的语义。默认行为是引发一个错误,表示该对象不支持项访问,这确实是您得到的。您所指的“默认项查找行为”到底是什么
MyObj
只有子类
object
,它没有要查找的项,也没有
x[i]
的语义。啊——谢谢,就这样!有时您只需要知道要问的正确问题。您的
DefaultDict
实现需要在返回出厂生成的值之前将其存储在字典中。:-)严格地说,
defaultdict
的工作原理与之稍有不同(即,它覆盖
\uuuuuuuuuu缺失\uuuuuuuuuuuuuu
,并且不触及
\uuuuuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)。这就是为什么我说这是一个意译;)我不想让
defaultdict
的精确接口妨碍我的观点,即您可以使用
\uuuu getitem\uuuu
返回默认值。请注意,无参数
super()
在Python 2.7中不起作用,问题被标记为。此外,您可能还想引发
keyrerror(key)
。后一点不只是一个诡辩,而是映射接口的一个重要部分。啊——谢谢,就这样!有时您只需要知道要问的正确问题。您的
DefaultDict
实现需要在返回出厂生成的值之前将其存储在字典中。:-)严格地说,
defaultdict
的工作原理与之稍有不同(即,它覆盖
\uuuuuuuuuu缺失\uuuuuuuuuuuuuu
,并且不触及
\uuuuuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)。这就是为什么我说这是一个意译;)我不想让
defaultdict
的精确接口妨碍我的观点,即您可以使用
\uuuu getitem\uuuu
返回默认值。请注意,无参数
super()
在Python 2.7中不起作用,问题被标记为。此外,您可能还想引发
keyrerror(key)
。后一点不仅仅是一个诡辩,而是映射接口的一个重要部分。