考虑你有两个如下定义的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 __.测试而s是class1.Test和v.check()检查__main __.测试,但是在一天结束时它是同一个类,对吧?
有没有办法写v.check(),以便它也接受class1.Test对象,或任何其他方式来解决这个问题?
最佳答案
如果您打算从其他地方导入class1.py,请将顶级代码(如果__name__ ==’__ main__’:…)移动到一个单独的文件中.这样主文件和class2都可以使用相同的class1.Test类.
几乎做任何事都会打开一堆蠕虫.虽然你可以通过将isinstance切换到type(myObject).__ name__ == …来解决当前问题,但事实仍然是你的Python进程包含两个Test类,其中只有一个.其他无法区分的类彼此无关,并且彼此失败的子类测试.这实际上保证了难以诊断的错误.
编辑
另一种选择是在执行main时从class1显式导入类,如答案中所示.建议更进一步,确保类没有以double形式定义.例如,您可以将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