引用整数作为 python 类中的静态变量



我正在尝试在python中的类中有一个静态int。但它不起作用。

这是我实现的示例:

class MyDict(dict):
STR_DEPTH = -1
def __init__(self, **kwargs):
super(MyDict, self).__init__(**kwargs)
self.__dict__.update(name = kwargs.get("name", ""))
def __str__(self):
self.STR_DEPTH += 1
res = self.name + 'n'
for k in self.keys():
res += 't'*self.STR_DEPTH + k + " = "  + str(self[k])
res += 'n'
self.STR_DEPTH -= 1
return res
def main():
d1 = MyDict(one=MyDict())
d1["two"] = 2
d1["one"]["one"] = 1
d1["one"]["two"] = MyDict(three=3)
d1["four"] = 4
print d1
if __name__ == "__main__":
main()

我期待:

four = 4
two = 2
one = 
two = 
three = 3
one = 1

但它不是那样工作的。如果我没记错的话,int 不是引用,在我的类的每个实例中它都不是相同的"STR_DEPTH"。

我已经知道长度列表 1 技巧和空型技巧,但我真的需要诉诸笨拙的不可读技巧吗?

既然我在课堂上,没有更好的方法吗?

您在哪里:

self.STR_DEPTH += 1

将其替换为:

MyDict.STR_DEPTH += 1

与您递减值的地方相同。

分配给self.STR_DEPTH将创建一个新的实例变量,该变量通过self隐藏对类变量的访问。您可以使用self.STR_DEPTH访问类变量,前提是您没有同名的实例变量,但如果要重新绑定类变量,则必须直接引用它。

请注意,self.STR_DEPTH += 1实际上只是self.STR_DEPTH = self.STR_DEPTH + 1的简写,因此即使右手self.STR_DEPTH拾取类变量,赋值仍然会回到实例变量。

最新更新