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

时间:2015-02-16 13:23:39

标签: python oop

我是Python的新手,我尝试使用类来编写使用对象的程序,就像我使用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()对象来调用成员函数test(),该函数创建一个B()对象并调用使用A()对象的成员函数do()。

所以在B :: do()中我想使用内置函数 isinstance()检查参数。但是python告诉我, NameError:全局名称' A'未定义

A()类文件导入b.py文件的顶部。

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

2 个答案:

答案 0 :(得分:1)

如某些评论中所指出的,如果以from a import A形式导入循环依赖关系,则无法很好地处理。

简而言之,... import *的问题是导致局部范围覆盖其所有声明,实际上是从哪个模块(在您的情况下)中识别出一个类。这恰恰会导致您面临的问题。

通过以下方式更改import语句以及对a.A的分类引用,会生成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?中讨论过。我会特别指出这个答案:https://stackoverflow.com/a/2454460/1540197

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

答案 1 :(得分:0)

你有一个循环依赖,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 )