Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从代码中的不同点访问全局变量_Python_Python 3.x - Fatal编程技术网

Python 如何从代码中的不同点访问全局变量

Python 如何从代码中的不同点访问全局变量,python,python-3.x,Python,Python 3.x,我试图找到一种基本上进行后期评估的方法,使用代码中不同位置的上下文。例如,我有一个类Friend,它可以这样使用: >>> class A: ... friend = Friend('B') ... >>> class B: ... friend = Friend('A') ... >>> A.friend.getobject() <class '__main__.B'> class Friend: d

我试图找到一种基本上进行后期评估的方法,使用代码中不同位置的上下文。例如,我有一个类
Friend
,它可以这样使用:

>>> class A:
...     friend = Friend('B')
...
>>> class B:
...     friend = Friend('A')
...
>>> A.friend.getobject()
<class '__main__.B'>
class Friend:

    def __init__(self, objname):
        self.objname = objname

    def getobject(self):
        return eval(self.objname, original_context)
sqlalchemy ORM在定义列方面有类似的模式,但它们通过跟踪会话中所有拥有的类(即表)来实现。如果需要的话,我可以做类似的事情,但我想知道是否有其他方法可以做到这一点。我一直在研究帧和解释器堆栈,我想我可以使用类似于
inspect.stack()[1][0].f_locals
的方法来获得相关帧的局部变量,但我必须在
frame.\uu init__u
中执行此操作,它在定义对象之前被调用

我的问题是如何找到原始上下文,但只在需要的时候。这归结为两个问题: 1.如何访问实例化了
Friend
的环境(或框架?)。
2.如何在调用
getobject
时访问它。

您必须使用完全限定的类名,即:

 class A:
     friend = Friend('themodule.B')
然后取那个字符串,提取模块并导入B类,然后像这样生成它

但是,一般来说,更好的方法是:

 class A:
     friend = Friend(B)
在这种情况下,此时未定义B,但您可以轻松地执行以下操作:

class A:
    pass

class B:
    pass

A.friend = Friend(B)
B.friend = Friend(A)