首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初始化从基类型派生的类

初始化从基类型派生的类
EN

Stack Overflow用户
提问于 2021-04-02 20:29:56
回答 2查看 103关注 0票数 1

我正在创建一个名为Environment的类,它对字典进行子类处理。看起来是这样的:

代码语言:javascript
复制
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 included

Pylint抱怨道:

不调用基类'dict‘中的super-init-not-called

__init__方法。

super()类型上执行dict会做什么?这是需要做的事情吗?如果是的话,为什么需要这样做?

在玩了一会儿之后,我不太确定它能做什么(或者它可以自动地在幕后做super )。下面是一个例子:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-02 20:45:49

Pylint不知道dict.__init__做什么。它不能确定在该方法中是否存在一些重要的设置逻辑。这就是它警告您的原因,这样您就可以决定打电话给super().__init__以确保安全,或者,如果您确信不需要调用,则可以将警告沉默。

我非常肯定,当您想要将实例初始化为空字典时,不需要调用dict.__init__。但这可能取决于您继承的dict类的实现细节(它在class等效的__new__中完成了所有的设置)。另一个Python实现可能会为__init__中的字典执行更多的设置工作,这样您的代码就无法正常工作。

为了安全起见,通常调用父类的__init__方法是个好主意。这是如此广泛的建议,以致于它被烤成了皮林特。您可以忽略这些警告,甚至可以在代码中添加注释,以抑制那些不适用于代码某些部分的注释(这样它们就不会分散您对实际问题的注意力)。但是大多数警告通常都是好的,即使它们在当前代码中没有反映出严重的错误。

票数 2
EN

Stack Overflow用户

发布于 2021-04-02 20:37:12

它所做的正是文档告诉我们的:它调用父类的__init__方法。这将执行所有您想要从父级继承的属性后面的初始化。

通常,如果不使用call super().__init__(),则对象只具有添加的parent字段,以及对父对象的方法和类属性的访问。对于任何不使用初始化参数的类--特别是不动态初始化任何字段的类,这将很好地工作(警告除外)。

Python内置类型可以满足您的期望(或希望),所以您的给定用途是可以的。

相反,考虑将Env类扩展到一个称为Context的类的情况:

代码语言:javascript
复制
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__()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66924896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档