【发布时间】:2019-03-28 17:50:24
【问题描述】:
在父类中,我定义了一个类变量和一个用于修改类变量值的类方法。我希望每个子类都使用自己的变量,而不是与其父类共享。
但结果不是我所期望的;在下面的示例中,我有两组父类和子类,以及一些代码来演示出了什么问题:
class P:
_X = 0
@classmethod
def cm(cls):
print("In p cm")
cls._X += 1
class C1(P):
pass
class C2(P):
pass
class Image:
_callbacks = {}
@classmethod
def registerDataFormat(cls, fmt, loader):
if fmt in cls._callbacks.keys():
print("The %s format has already been registered." % (fmt))
return False
cls._callbacks[fmt] = {}
cls._callbacks[fmt]["loader"] = loader
class HSImage(Image):
pass
class GT(Image):
pass
if __name__ == '__main__':
C1.cm()
print(C1._X)
print(P._X)
C2.cm()
print(C2._X)
print(P._X)
HSImage.registerDataFormat("mat", "loader 1")
print(HSImage._callbacks)
print(Image._callbacks)
GT.registerDataFormat("mat", "loader 2")
print(GT._callbacks)
print(Image._callbacks)
结果如下:
In p cm
1
0
In p cm
1
0
{'mat': {'loader': 'loader 1'}}
{'mat': {'loader': 'loader 1'}}
The mat format has already been registered.
{'mat': {'loader': 'loader 1'}}
{'mat': {'loader': 'loader 1'}}
第一个例子有预期的结果,但第二个没有,为什么我在第二组类中的一个子类上调用类方法时,类变量与父类共享?
我的预期结果:
In p cm
1
0
In p cm
1
0
{'mat': {'loader': 'loader 1'}}
{}
{'mat': {'loader': 'loader 2'}}
{}
【问题讨论】:
-
顺便说一句,感谢您提供完整的 MCVE,并感谢您对它进行了更多清理以收紧它。这在新问题中并不常见。
标签: python class inheritance class-variables