python局部import和全局import的疑问

现有两个文件 classA.py 和 classB.py。代码如下

classB

from classA import classA

class classB:
    def changeA(self):
        classA.name="classB"
        print(classA.name)

classA

class classA:
    name = "classA"

def printA():
    print(classA.name)


if __name__ == "__main__":
    printA()
    from classB import classB
    classB().changeA()
    printA()

其中,A类定义了个类变量,所有成员都可以修改该值,但是运行classA.py结果为:

classA
classB
classA

如果在创建一个文件,main.py

main.py

from classB import classB
from classA import *

printA()
classB().changeA()
printA()

运行结果为:

classA
classB
classB

在第一次运行中,类B中的函数并没有成功修改类A的成员,而第二次运行中成功修改了。两次运行的区别就是一个是在函数内部局部import,另一个是在文件头全局import,请问出现这个运行差异的原因是什么?

这么说吧,第一个例子里运行的是main.classA, 而修改的是classA.classA, 所以看起来没有修改成功。第二个例子里,运行的和修改的都是classA.classA,所以显得修改成功了。
区别在于代码是被import的,还是独立运行的,这也是一般代码为了防止被调用,要加上 if "name" == "main" 的原因。

  • 这篇博客: Python Class 类的继承与多继承中的 6.1 类方法名称和全局变量冲突 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • # 通过此例可以看出,类属性方法print和全局print并不冲突
    
    class Document:
        def __init__(self, content):
            self.content = content
        
        def print(self):
            raise NotImplementedError('Not Implemented')
            
    
    class Word(Document):pass
    
    class Printable:
        def print(self):
            print(self.content)
            
    class PrintableWordMixin(Printable, Word):
        pass
    
    instance1 = PrintableWordMixin('word test string')
    PrintableWordMixin.mro()
    # [__main__.PrintableWordMixin, __main__.Printable, __main__.Word, __main__.Document, object]
    instance1.print()
    # word test string