gpt4 book ai didi

Python import 语句根据 __init__.py 中的位置不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:04 32 4
gpt4 key购买 nike

让我们采用这样的文件夹结构:

project_root
│ start.py
└───Application
└───ViewModels
│ __init__.py
│ MagnifierWindowViewModel.py
│ MainViewModel.py
│ MainWindowViewModel.py
│ PlotterWindowViewModel.py

这些是文件的内容:

start.py

from Application.ViewModels import MainViewModel

if __name__ == "__main__":
mainViewModel = MainViewModel()

Application\ViewModels\__init__.py

from Application.ViewModels.PlotterWindowViewModel import *
from Application.ViewModels.MagnifierWindowViewModel import *
from Application.ViewModels.MainViewModel import *
from Application.ViewModels.MainWindowViewModel import *

Application\ViewModels\MagnifierWindowViewModel.py

class MagnifierWindowViewModel(object):
def __init__(self):
pass

Application\ViewModels\MainViewModel.py

from Application.ViewModels import MagnifierWindowViewModel, MainWindowViewModel, PlotterWindowViewModel

class MainViewModel(object):
def __init__(self):
self.mainWindowVM = MainWindowViewModel()
self.magnifierWindowVM = MagnifierWindowViewModel()
self.plotterWindowVM = PlotterWindowViewModel()

Application\ViewModels\MainWindowViewModel.py

class MainWindowViewModel(object):
def __init__(self):
pass

Application\ViewModels\PlotterWindowViewModel.py

class PlotterWindowViewModel(object):
def __init__(self):
pass

使用这个结构,我得到这个错误:

Traceback (most recent call last):
File "project_root/start.py", line 4, in <module>
mainViewModel = MainViewModel()
File "project_root/Application/ViewModels/MainViewModel.py", line 5, in __init__
self.mainWindowVM = MainWindowViewModel()
TypeError: 'module' object is not callable

但是如果我首先将最后一行放在 Application\ViewModels\__init__.py 中,应用程序运行得很好。这是为什么?

我有这个 Application\ViewModels\__init__.py 的原因是我可以写

from Application.ViewModels import MagnifierWindowViewModel

代替

from Application.ViewModels.MagnifierWindowViewModel import MagnifierWindowViewModel

最佳答案

您已将每个类都固定在其自己的模块中,并命名为与该类完全相同的名称。这是一个非常糟糕的主意,因为您在这里看到的原因是:很容易混淆类和模块。

当您的 MainViewModel.py 执行导入时:

from Application.ViewModels import MagnifierWindowViewModel, MainWindowViewModel, PlotterWindowViewModel

导入的内容取决于 Application\ViewModels\__init__.py 的执行量。如果这一行还没有执行:

from Application.ViewModels.MainWindowViewModel import *

然后 MainViewModel.py 中的导入导入 MainWindowViewModel 模块。如果 import * 已执行,那么它将使用模块内定义的 MainWindowViewModel 类隐藏 MainWindowViewModel 模块,因此 MainViewModel.py 中的导入会导入 MainWindowViewModel 类。

关于Python import 语句根据 __init__.py 中的位置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53177199/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com