Python基类共享属性?
这个问题在这里已经有了答案:
你正在犯一个普通的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