我正在创建一个名为Environment的类,它对字典进行子类处理。看起来是这样的:
class Env(dict):
"An environment dict, containing the parent Env (or None) where created."
def __init__(self, parent=None):
self.parent = parent
# super().__init__() <-- not includedPylint抱怨道:
不调用基类'dict‘中的super-init-not-called:
__init__方法。
在super()类型上执行dict会做什么?这是需要做的事情吗?如果是的话,为什么需要这样做?
在玩了一会儿之后,我不太确定它能做什么(或者它可以自动地在幕后做super )。下面是一个例子:
class Env1(dict):
def __init__(self, parent=None):
self.parent = parent
super().__init__()
class Env2(dict):
def __init__(self, parent=None):
self.parent = parent
dir(Env1()) == dir(Env2()), len(dir(Env1))
(True, 48)发布于 2021-04-02 20:45:49
Pylint不知道dict.__init__做什么。它不能确定在该方法中是否存在一些重要的设置逻辑。这就是它警告您的原因,这样您就可以决定打电话给super().__init__以确保安全,或者,如果您确信不需要调用,则可以将警告沉默。
我非常肯定,当您想要将实例初始化为空字典时,不需要调用dict.__init__。但这可能取决于您继承的dict类的实现细节(它在class等效的__new__中完成了所有的设置)。另一个Python实现可能会为__init__中的字典执行更多的设置工作,这样您的代码就无法正常工作。
为了安全起见,通常调用父类的__init__方法是个好主意。这是如此广泛的建议,以致于它被烤成了皮林特。您可以忽略这些警告,甚至可以在代码中添加注释,以抑制那些不适用于代码某些部分的注释(这样它们就不会分散您对实际问题的注意力)。但是大多数警告通常都是好的,即使它们在当前代码中没有反映出严重的错误。
发布于 2021-04-02 20:37:12
它所做的正是文档告诉我们的:它调用父类的__init__方法。这将执行所有您想要从父级继承的属性后面的初始化。
通常,如果不使用call super().__init__(),则对象只具有添加的parent字段,以及对父对象的方法和类属性的访问。对于任何不使用初始化参数的类--特别是不动态初始化任何字段的类,这将很好地工作(警告除外)。
Python内置类型可以满足您的期望(或希望),所以您的给定用途是可以的。
相反,考虑将Env类扩展到一个称为Context的类的情况:
class Context(Env):
def __init__(upper, lower):
self.upper = upper
self.lower = lower
ctx = Context(7, 0)
print(ctx.upper)
print(ctx.parent)在最后一条语句中,您将得到一个运行时错误:ctx没有属性parent,因为我从未在Context.__init__中调用super().__init__()
https://stackoverflow.com/questions/66924896
复制相似问题