gpt4 book ai didi

python - 为什么从不同的文件位置调用时会得到不同的结果?

转载 作者:行者123 更新时间:2023-12-02 18:30:38 24 4
gpt4 key购买 nike

我想动态加载

我有三个文件,MainClass.pyMyClassA.pyMyClassB.py。为什么我从 MainClass.pyMyClassA.py 运行不同的结果?当从 MainClass.py 运行时,结果是:

B

这就是我想要的结果。从 MyClassA.py 运行时,结果为:

MainClass.property is None! 

MainClass.py的代码如下:

from MyClassA import MyClassA, main

if __name__ == '__main__':
MyClassA.property = 'B'
main()

MyClassA.py的代码如下:

import importlib


class MyClassA:
property = None


def main():
module_name = 'MyClass' + MyClassA.property
class_name = module_name
module_object = importlib.import_module(module_name)
module_class_object = getattr(module_object, class_name)

'''
The reason why I quote MyClassA here is that because module_class_object is dynamically loaded,
PyCharm cannot automatically prompt related content when writing code,
and the upper class is subject to the first one,
so I put MyClassA in the second referenced for my convenience PyCharm writes code.
'''

class MainClass(module_class_object, MyClassA):
pass

if MainClass.property is None:
print('MainClass.property is None!')
else:
print(MainClass.property)


if __name__ == '__main__':
MyClassA.property = 'B'
main()

MyClassB.py的代码如下:

from MyClassA import MyClassA


class MyClassB(MyClassA):
pass

最佳答案

这是因为MyClassAMyClassB.py 中导入的对象与MyClassA.py:MyClassA不同当调用该脚本作为主脚本时。原因是 Python 将为导入创建一个新的模块对象(与 __main__ module 不同)。您可以通过添加 print(MainClass.mro()) 来验证这一点在类定义之后将输出以下内容:

# python MainClass.py
[<class 'MyClassA.main.<locals>.MainClass'>,
<class 'MyClassB.MyClassB'>,
<class 'MyClassA.MyClassA'>,
<class 'object'>]

# python MyClassA.py
[<class '__main__.main.<locals>.MainClass'>,
<class 'MyClassB.MyClassB'>,
<class 'MyClassA.MyClassA'>,
<class '__main__.MyClassA'>,
<class 'object'>]

现在因为你定义了class MainClass(module_class_object, MyClassA)module_class_object出现在 MRO 的前面。 IE。当您询问MainClass.property时它将在 <class 'MyClassA.MyClassA'> 中找到该属性而不是<class '__main__.MyClassA'>这是您修改的类。

另一方面,当运行python MainClass.py时,然后两个模块( __main__MyClassB.py )导入相同的模块对象 MyClassA因为它缓存在 sys.modules 中。因此,对此模块中定义的对象的所有更改都在使用该模块 MyClassA 的所有其他模块之间共享。 .

关于python - 为什么从不同的文件位置调用时会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69466953/

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