封闭类(非父类)的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,在不改变太多代码的情况下,效果非常好。你让我很开心;)