我正在尝试在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
拾取类变量,赋值仍然会回到实例变量。