Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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_Oop_Class_Variables_Circular Dependency - Fatal编程技术网

在Python中使用静态类变量

在Python中使用静态类变量,python,oop,class,variables,circular-dependency,Python,Oop,Class,Variables,Circular Dependency,Python不允许我将类相互导入。我知道Python中没有“包”解决方案,所以我不确定如何做到这一点。查看我的文件的代码: 文件Main.py: from Tile import tile tile.assign() class main: x = 0 @staticmethod def assign(): tile.x = 20 文件Tile.py: from Main import main main.assign() class tile:

Python不允许我将类相互导入。我知道Python中没有“包”解决方案,所以我不确定如何做到这一点。查看我的文件的代码:

文件Main.py:

from Tile import tile
tile.assign()
class main:
    x = 0
    @staticmethod
    def assign():
        tile.x = 20
文件Tile.py:

from Main import main
main.assign()
class tile:
    x = 0
    @staticmethod
    def assign():
        main.x = 20

我收到错误“无法导入类磁贴”。

您将向后导入,并且来自的
需要有模块的名称

from Tile import tile

您需要向后导入,并且来自的
需要有模块的名称

from Tile import tile

如果文件A导入文件B,而文件B导入文件A,它们将无限期地相互导入,直到程序崩溃


您需要以一种不需要这种循环依赖的方式重新思考您的逻辑。例如,第三个文件可以同时导入两个文件并执行两个赋值。

如果文件a导入文件B,而文件B导入文件a,则它们将无限期地相互导入,直到程序崩溃


您需要以一种不需要这种循环依赖的方式重新思考您的逻辑。例如,第三个文件可以导入这两个文件并执行这两个赋值。

Python开始执行Main.py。它看到导入,然后执行Tile.py注意,它还没有执行class语句

因此Python开始执行Tile.py。它看到一个来自Main的导入,并且它的内存中已经有了该模块,因此它不会重新执行Main.py中的代码(如果它这样做,更糟糕的事情会出错)。它试图从
main
模块中拉出一个变量
main
,但类语句绑定
main
尚未执行(我们仍在执行import语句的过程中,请注意该行)。因此,在模块
main
中没有clsss
main
(或
Tile
,如果从那里开始)会出现错误

您可以通过导入模块而不是从模块中导入类,并使用限定名称来避免这种情况,但是当
Main.Main
不起作用时,您会掉下来一行。你的代码毫无意义,我是一种动态语言;不能在调用了
main.assign
之后才调用类main的定义,也不能在调用了
main.assign
之后才调用类
tile
的定义


如果您真的需要这种循环依赖关系(这通常是,但并不总是在设计阶段出现问题的迹象),那么您需要将定义类、函数和变量的“脚手架”与实际调用类、函数或使用变量的“执行”分开。然后,即使在导入过程中没有一个模块被正确初始化,循环导入的“脚手架”也会工作,当您开始“执行”时,一切都会工作。

Python开始执行Main.py。它看到导入,然后执行Tile.py注意,它还没有执行class语句

因此Python开始执行Tile.py。它看到一个来自Main的导入,并且它的内存中已经有了该模块,因此它不会重新执行Main.py中的代码(如果它这样做,更糟糕的事情会出错)。它试图从
main
模块中拉出一个变量
main
,但类语句绑定
main
尚未执行(我们仍在执行import语句的过程中,请注意该行)。因此,在模块
main
中没有clsss
main
(或
Tile
,如果从那里开始)会出现错误

您可以通过导入模块而不是从模块中导入类,并使用限定名称来避免这种情况,但是当
Main.Main
不起作用时,您会掉下来一行。你的代码毫无意义,我是一种动态语言;不能在调用了
main.assign
之后才调用类main的定义,也不能在调用了
main.assign
之后才调用类
tile
的定义


如果您真的需要这种循环依赖关系(这通常是,但并不总是在设计阶段出现问题的迹象),那么您需要将定义类、函数和变量的“脚手架”与实际调用类、函数或使用变量的“执行”分开。然后,即使在导入过程中没有任何模块正确初始化,循环导入的“脚手架”也会起作用,当您开始“执行”时,一切都会起作用。

我确信您的意思是
从Tile导入Tile
我的文件就是这样,我只是不小心把这里的代码写错了。不管怎样,我还是会遇到同样的错误。@azonicrider你能发布完整的回溯吗?请原谅我的无知,但我不确定回溯是什么。这是完整的错误消息吗?所以当你在解释器中运行它时,它会出错并将内容打印到你的终端。复制所有这些错误消息(或回溯),并将其与您的问题一起忽略。对你所有的问题都这样做是个好主意。我确信你的意思是
从Tile导入Tile
我的文件就是这样,我只是无意中把代码写错了。不管怎样,我还是会遇到同样的错误。@azonicrider你能发布完整的回溯吗?请原谅我的无知,但我不确定回溯是什么。这是完整的错误消息吗?所以当你在解释器中运行它时,它会出错并将内容打印到你的终端。复制所有这些错误消息(或回溯),并将其与您的问题一起忽略。尽管我同意你避免循环导入,但他可以使用
import Tile
而不是
from Tile import Tile
,而不是使用
从Tile import Tile
,如果Python没有toNo,它不会两次导入同一个模块,但它将无法编译特定代码,具体取决于它的顺序