从同一文件但从两个不同位置导入相同的 Python 对象会产生两种不同的对象类型

发布于 2025-01-11 14:28:04 字数 1262 浏览 0 评论 0 原文

我有一个按如下目录组织的项目:

|main_dir/
|        /__init__.py
|        /core/
|             /__init__.py
|             /foo.py
|             /test1.py            
|        /scr/
|            /test2.py

在 foo.py 中,我定义了一个类,如下所示

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

这是我在 core/test1.py 中的内容

from foo import foo
f1=foo()
print(type(f1))

这是我在 scr/test2.py 中的内容:

import sys
sys.path.append('../')
from core.foo import foo

f2 = foo()
print(type(f2))

main_dir/__init__ .py 包含:

__all__ = ["core"]

import sys, os
dir = os.path.dirname(__file__)

for subpackage in __all__:
     sys.path.append(os.path.join(dir,subpackage))

并且 core/__init__.py 包含:

__all__ = ["foo"]
import sys, os
dir = os.path.dirname(__file__)

for subpackage in __all__:
   sys.path.append(os.path.join(dir,subpackage))

当我运行 test1.py 时,结果是 class 'foo.foo'> while当我跑步时test2.py,我得到 。我知道这就是 Python 的行为方式,但我不知道如何解决它。我想在检查 type(f1) == type(f2) 时得到 True,因为我需要访问不同位置的对象 foo

I have a project organized in directories as follows:

|main_dir/
|        /__init__.py
|        /core/
|             /__init__.py
|             /foo.py
|             /test1.py            
|        /scr/
|            /test2.py

In foo.py, I define a class as follows

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

This is what I have in core/test1.py

from foo import foo
f1=foo()
print(type(f1))

This is what I have in scr/test2.py:

import sys
sys.path.append('../')
from core.foo import foo

f2 = foo()
print(type(f2))

main_dir/__init__.py contains this:

__all__ = ["core"]

import sys, os
dir = os.path.dirname(__file__)

for subpackage in __all__:
     sys.path.append(os.path.join(dir,subpackage))

and core/__init__.py contains:

__all__ = ["foo"]
import sys, os
dir = os.path.dirname(__file__)

for subpackage in __all__:
   sys.path.append(os.path.join(dir,subpackage))

When I run test1.py, the result is class 'foo.foo'> while when I run test2.py, I get <class 'core.foo.foo'>. I understand that this is how Python behaves, but I am not sure how to get around it. I would like to get True when checking type(f1) == type(f2) as I need to access the object foo for different locations.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花桑 2025-01-18 14:28:04

将 test2.py: 中的前两行添加

import sys
sys.path.append('../')

到 test1.py 的顶部。然后更改 test1.py 和 test2.py 中 foo 的导入以使用完全限定名称:

from main_dir.core.foo import foo

之后:

# core/test.py
<class 'main_dir.core.foo.foo'>
# scr/test2.py
<class 'main_dir.core.foo.foo'>

Add the first two lines from test2.py:

import sys
sys.path.append('../')

to the top of test1.py. Then change your imports of foo in test1.py and test2.py to use the fully-qualified name:

from main_dir.core.foo import foo

Afterward:

# core/test.py
<class 'main_dir.core.foo.foo'>
# scr/test2.py
<class 'main_dir.core.foo.foo'>
相对绾红妆 2025-01-18 14:28:04

我认为在文件 core/test1.py 中,您可以尝试像这样

from .foo import foo

在文件名前加点来导入 foo,以确保同一目录中的文件尝试一下

,或者

您可以使用像这样的方式导入 foo

from .foo import foo as foo_one
from core.foo import foo as foo_core

我希望我了解您需要什么,希望对您有所帮助

I think in file core/test1.py You can try to import foo like this

from .foo import foo

with the dot before the file name to ensure that is the file in the same directory gave it a try

or

You can import foo using as like it down

from .foo import foo as foo_one
from core.foo import foo as foo_core

I hope I understand what do you need and I hope it will help

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文