我是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文件的顶部。
有谁知道我在这里做错了什么?
答案 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 )