Python: isinstance() 未定义全局名称

Python: isinstance() undefined global name

我是 Python 的新手,我正在尝试使用 classes 像使用 C++ 一样使用对象进行编程。

我写了 3 个 .py 文件。

a.py

from b import *

class A:
    def __init__(self):
        self.m_tName = "A"

    def test(self):
        tB = B()

        tB.do( self )

b.py

from a import *

class B:
    def __init__(self):
        self.m_tName = "B"

    def do(self, tA ):
        if not isinstance( tA, A ):
            print ( "invalid parameter" )

        print( "OK" )

demo.py:

from a import *

if __name__ == "__main__":
    tA = A()

    tA.test()

如您所见,我想使用 A() 对象调用创建 B() 对象的成员函数 test() 并调用使用 A() 对象的成员函数 do()。

所以在 B::do() 中我想使用内置函数 isinstance() 检查参数。但是 python 告诉我有一个 NameError: global name 'A' is not defined.

A() class 文件被导入到 b.py 文件的顶部。

有谁知道我在这里做错了什么?

您有循环依赖,a.py 和 b.py 相互导入。

您可以将任一 import 语句移动到使用它的方法中。 所以 b.py 会变成:

class A:
    def __init__(self):
        self.m_tName = "A"

    def test(self):
        from b import B
        tB = B()

        tB.do( self )

正如一些评论所指出的,如果以 from a import A.

的形式导入,则循环依赖性无法很好地处理

简而言之,... import * 的问题是导致本地作用域的所有声明都被覆盖,实际上是从哪个模块(在您的情况下)识别 class来自。这正是您所面临的原因。

按以下方式更改 import 语句,连同对 a.A 的 class 化引用,生成 OK 作为输出。

import a

class B:
    def __init__(self):
        self.m_tName = "B"

    def do(self, tA ):
        print tA
        if not isinstance( tA, a.A ):
            print ( "invalid parameter" )

        print( "OK" )

作为一些附加信息,这已在 Why is "import *" bad?. I would point in special to this answer: 中讨论过。

**编辑:**这 article 解释导入混淆。