考虑您有两个如下定义的python文件。说一个是通用程序包(class2
),另一个是特定的替代程序并用作可执行文件(class1
)。
class1.py:
#!/usr/bin/python
class Test(object):
pass
class Verificator():
def check(self, myObject):
if not isinstance( myObject, Test ):
print "%s is no instance of %s" % (type(myObject),Test)
else:
print "OK!"
if __name__ == '__main__':
from class2 import getTest
v = Verificator()
t = Test()
v.check(t)
s = getTest()
v.check(s)
class2.py:
from class1 import Test
def getTest():
return Test()
发生的情况是,第一次检查是正确的,第二次失败了。原因是
t
是__main__.Test
,而s
是class1.Test
,而v.check()
检查__main__.Test
,但归根结底,它是同一类,对吗?有没有一种方法可以编写
v.check()
使其也接受class1.Test
对象,或者有其他方法可以解决此问题? 最佳答案
如果您打算从其他位置导入class1.py
,则将顶级代码(if __name__ == '__main__': ...
一起移动到一个单独的文件中。这样,主文件和class2
都可以使用相同的class1.Test
类。
几乎做其他任何事情都会打开一 jar 蠕虫。尽管您可以通过将isinstance
切换为type(myObject).__name__ == ...
来解决紧迫的问题,但事实是您的Python进程包含两个Test
类,其中应该只有一个。否则无法区分的类彼此一无所知,并且彼此的issubclass
测试失败。这实际上保证了难以诊断的错误。
编辑
另一个选择是像在您的答案中那样以main身份执行时从class1
显式导入类。建议更进一步,并确保不要将类定义为双重类型。例如,您可以将if __name__ == '__main__'
块移动到文件的开头,并以sys.exit(0)
结尾:
if __name__ == '__main__':
import class1, class2
... use only the public API with module prefixes ...
sys.exit(0)
# the rest of the module follows here
关于python - python命名空间: __main__.类不是package.Class的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15159854/