在类外更改类属性值
我有一个这样的图书馆:
class Robot:
__counter = 0
@classmethod
def get_c(cls):
result = cls.__counter + 1
return result
我试图通过初始化类属性 __counter = 1 来访问这个类,所以我可以从 get_c() 函数中得到 2。这就是我所做的:
Robot.__counter = 1
x = Robot()
x.get_c()
为什么结果仍然是 1 以及在不接触班级内部的情况下做我想做的事情的解决方案是什么,谢谢!
回答
您已经使用了双下划线 name-mangling。每次你这样做时都会翻译:
__some_var
在类定义内进入:
_MyClass__some_var
这就是重点——避免子类中的名称冲突。
如果您想在类外访问它,请不要使用双下划线名称修改。
我不确定你所说的“没有在内部接触班级”是什么意思,但在这种情况下:
Robot._Robot__counter = 1
会起作用,尽管执行上述操作表明您不应该使用双下划线名称修改。
顺便说一句,这并不等同于具有访问修饰符的语言中的“私有”,尽管它对于有限的用例具有相同的目的,防止子类中的意外名称冲突。