Python基类共享属性?

这个问题在这里已经有了答案:

  • Python的构造函数和默认值[复制] 4个答案
  • “最小的惊讶”和可变的默认参数30的答案

  • 你正在犯一个普通的Python新手错误。

    在这里看到我的答案:我应该如何在Python中声明实例变量的默认值?

    简而言之,Python只解释类定义一次 。 这意味着在__init__()方法中声明的所有内容只会被创建一次。 或者,换句话说,你的[]列表默认参数只有一次。

    然后self.l = l在每次创建一个新类时为同一个实例分配一个引用 ,因此这是您不期待的行为。

    Pythonic的方式是这样的(部分代码):

    def __init__(self, arg=None):
        if arg is None:
            arg = []
        self.arg = arg
    

    此外,您应该考虑使用比l更好的命名约定,这很难阅读,可能会被误认为1|


    这被称为可变的默认参数错误,这个错误通常由Python新手所做。 当你将一个可变参数作为默认参数时,当需要使用默认参数时,同一个对象会在实例间使用。 获得更好的理解检查http://docs.python.org/tutorial/controlflow.html#default-argument-values中的重要警告部分

    在你的代码中,实例a在它的init调用中使用了可变默认参数(一个空的列表对象),并且当你创建b的实例时,又调用Base的init方法,再次使用与它中使用的对象相同的对象在里面。 简单的单词al和bl指向相同的列表对象。

    一个非常类似的讨论 - “最小的惊讶”和可变的默认论据

    链接地址: http://www.djcxy.com/p/28533.html

    上一篇: Python base classes share attributes?

    下一篇: Python: Dictionary as instance variable