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

2024-04-20 08:15:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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公司

^{pr2}$

在演示.py公司名称:

from a import *

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

    tA.test()

如您所见,我希望使用a()对象来调用创建B()对象的成员函数test(),并调用使用a()对象的成员函数do()。在

所以在B::do()中,我想使用内置函数isinstance()检查参数。但是python告诉我有一个名称错误:全局名称'a'没有定义。在

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

有人知道我做错了什么吗?在


Tags: 文件对象函数frompytestimportself
2条回答

正如一些评论所指出的,如果以from a import A的形式导入,则循环依赖关系处理得不好。在

简而言之,... import *的问题是,这会导致局部作用域的所有声明都被重写,这实际上导致了一个类(在您的例子中)来自哪个模块的标识。这正是你所面临的。在

以以下方式更改import语句,加上对a.A的分类引用,将生成{}作为输出。在

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解释导入混乱。在

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

相关问题 更多 >