用于修改超类行为线程的静态字段是否安全?

时间:2014-03-16 19:32:07

标签: python multithreading thread-safety subclass

如果子类想要通过静态字段修改继承方法的行为,它是否是线程安全的?

更具体地说:

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类中应该表现的风险,反之亦然?我会说是的,但我想知道是否有人经历过实际测试这种模式。

注意:这不是关于模式本身的问题,我认为应该避免这种问题,而是关于它的后果,正如我在回顾现实代码时发现的那样。

1 个答案:

答案 0 :(得分:0)

首先,请记住类是对象,静态字段(以及方法)是所述类对象的属性。

所以,self.do()会在do中查找self方法并调用do(self)self设置为被调用的任何对象,它本身引用其中一个类ABC作为其类。因此,查找将在正确的类中找到_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 ++的模板元编程和功能算法。