在这种情况下是否有必要使用super().__ init __()?

时间:2016-03-26 17:37:57

标签: python hierarchy

修改 对不起,伙计们。这个问题是重复的,但不是链接的问题。我已经在这个问题中找到了我需要的东西,也许我应该在下次尝试更多关键词来搜索。Subclassing dict: should dict.init() be called?

就我而言,我在班级update中实施__setitem__StrKeyDict(dict),而从__new__继承的dict可能会创建一个空dict为了确保update可以正常工作,我认为不必再次使用super().__init__()

代码来自Fluent Python example-code/attic/dicts/strkeydict_dictsub.py

import collections.abc

class StrKeyDict(dict):

    def __init__(self, iterable=None, **kwds):
        super().__init__()
        self.update(iterable, **kwds)

    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]

    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()

    def __setitem__(self, key, item):
        super().__setitem__(str(key), item)

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def update(self, iterable=None, **kwds):
        if iterable is not None:
            if isinstance(iterable, collections.abc.Mapping):
                pairs = iterable.items()
            else:
                pairs = ((k, v) for k, v in iterable)
            for key, value in pairs:
                self[key] = value
        if kwds:
            self.update(kwds)

当我们使用

d = StrKeyDict(a=1,b=2) 

例如,要创建实例d,真正的事情是:

1.Call __new__继承自超类dict以创建空dict实例

2.Call __init__初始化实例

就像我说的那样,我在班级update中实施__setitem__StrKeyDict(dict)。所以有必要在这里使用super().__init__()。  谢谢!

2 个答案:

答案 0 :(得分:1)

一般来说,这是必要的。并且它通常是初始化的第一次调用所必需的。它首先调用父类(dict)的init函数。 它通常会创建其底层数据结构。

答案 1 :(得分:1)

超类' __init__()可能会或可能不会做一些必要的事情来初始化它。如果您知道具体情况,您可以做出明智的决定。如果您不知道最好的选择就是以防万一。

现在如果你没有调用它,因为它没有必要,并且基类的实现以一种必要的方式改变,那么你将不得不修复它。

另一方面,在某些情况下,调用超类__init__()是一个坏主意,例如,如果它对超类特别重要,并且在子类中是不同的。

FWIW我的方法总是打电话给super().__init__(),除非我有充分的理由不给它打电话。