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 解释导入混淆。
我是 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 解释导入混淆。