封闭类(非父类)的Python访问属性

封闭类(非父类)的Python访问属性,python,django,class,Python,Django,Class,我有一个简单的问题,我正在开发一些东西,我需要一些类访问一些常见的变量,比如: somevar="foo" class A(SomeParent): def eval_class(self): global somevar return somevar def index(request,input_somevar): global somevar somevar=input_somevar return HttpResponse(A().eval_cla

我有一个简单的问题,我正在开发一些东西,我需要一些类访问一些常见的变量,比如:

somevar="foo"

class A(SomeParent):
  def eval_class(self):
     global somevar
     return somevar

def index(request,input_somevar):
  global somevar
  somevar=input_somevar
  return HttpResponse(A().eval_class())
问题:代码在django上运行,因此,代码的每个请求都将继续运行,并且somevar将重新接收一个新值。如果请求发生重叠,我将为一个请求设置somevar值,该值由另一个请求设置

解决方案?我想到的是使用单个类的实例

Class Parent:
  somevar=None
  def set_somevar(self,somevar):
    self.somevar=somevar

  class A(SomeParent): #Note: the parent of this class is NOT "Parent".
    def eval_class(self):
      #Here I would like to retrieve somehow "somevar"
      return somevar

def index(request,input_somevar):
  p=Parent()
  p.set_somevar(input_somevar)
  return HttpResponse(p.A().eval_class())
注意:我无法将变量传递给类,它们必须能够访问“封闭但非父类”,因为它们是需要传递给Symphy解释器的Symphy函数类

提前谢谢你

使用
set\u somvavar()
设置实例
p
的属性值,而
somevar
全局保持不变。因此,
p.A().eval\u class()
将始终返回
None
(原始值)

编辑: 将全局
somevar
定义为类属性而不是实例属性时,设置此属性不会解决您的问题:假设您的意思是 使用
eval_class
返回
P().somevar

让父实例成为a-init函数的变量怎么样

class Parent:
    def __init__(self, somevar):
        self.somevar = somevar

    class A(SomeParent):
        def __init__(self, parent):
            SomeParent.__init__(self)
            self.parent = parent

        def eval_class(self):
            return self.parent.somevar

def index(request,input_somevar):
  p = Parent(input_somevar)
  return HttpResponse(p.A(p).eval_class())

为什么不把input_somevar传递给需要它的类呢

class A(SomeParent):
    def eval_class(self, somevar):
        return somevar

def index(request,input_somevar):
    return HttpResponse(A().eval_class(input_somevar))

如果您的视图调用其他类,如果需要,也可以将其传递给其他类。

与java不同,嵌套类不会链接到外部类的实例。它只是更改类可用的名称空间。这意味着
p.a
Parent.a
是一回事


正如Brian所说,最简单的方法可能是从视图中传递所需的变量。

基本上,你说Django应用程序的不同线程存在访问冲突:当其中一个线程正在读取
somevar
的值时,另一个线程正在修改它

所以你似乎在解决一个错误的问题。实际上,您需要以一种不会发生访问冲突的方式设计应用程序

理想的解决方案是根本没有共享状态。用于存储只能由一个(当前)线程访问的数据。不过,您必须解决关联性问题:如果一个请求转到这个线程,而同一客户机的下一个请求在几分钟后转到另一个线程,它将看不到前一个请求的数据集

另一种解决方案是使用数据库来序列化更改。以SQLite为例,它几乎没有重量,并且支持事务。一次更改会锁定
somevar
记录进行更新,而另一次更改它的事务将失败。你必须再次以一种有意义的方式解决这个问题


如果你描述一下你正在解决的更大的问题,那会有帮助。

我不能。具体来说,它是Symphy的一个类,定义了一个特殊的数学函数,在求值过程中,除了Symphy本身之外,它不能被“调用”。在下面的代码段中,somevar是一个类属性,因此self.somevar=somevar确实会修改类上的属性,而不仅仅是实例。这些修改将在请求之间持久存在,这对于视图的参数来说通常不是一件好事。这是真的,但对我帮助不大。;)基本上,问题更复杂。我收到一些输入,我调用一个库,它在数据库上执行一些繁重的map/reduce操作。此操作需要几秒钟。因此,如果同时收到其他输入,map/reduce进程将开始读取新输入(与前一个输入无关)。我应该重新设计部分代码以使用threading.local吗?文档非常晦涩..太好了,这解决了我的问题,在一个线程中加入函数,然后使用local,在不改变太多代码的情况下,效果非常好。你让我很开心;)