如果子类想要通过静态字段修改继承方法的行为,它是否是线程安全的?
更具体地说:
class A (object):
_m = 0
def do(self):
print self._m
class B (A):
_m=1
def test(self):
self.do()
class C (A):
_m=2
def test(self):
self.do()
在多线程环境中,是否存在类B调用do()的实例在C类中应该表现的风险,反之亦然?我会说是的,但我想知道是否有人经历过实际测试这种模式。
注意:这不是关于模式本身的问题,我认为应该避免这种问题,而是关于它的后果,正如我在回顾现实代码时发现的那样。
答案 0 :(得分:0)
首先,请记住类是对象,静态字段(以及方法)是所述类对象的属性。
所以,self.do()
会在do
中查找self
方法并调用do(self)
。 self
设置为被调用的任何对象,它本身引用其中一个类A
,B
或C
作为其类。因此,查找将在正确的类中找到_m
的值。
当然,这需要更正您的代码:
class A (object):
_m = 0
def do(self):
if self._m==0: ...
elif ...
您的原始代码无法正常工作,因为Python只在两个地方查找_m
:在函数中定义,或者作为全局。它不像C ++那样在类范围内看。因此,您必须使用self.
作为前缀,以便使用正确的_m
。如果您想强制它使用class A
中的A._m
,请改用{{1}}。
P.S。有时你需要这种模式,特别是对于元类,它有点类似于C ++的模板元编程和功能算法。