考虑您有两个如下定义的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,而sclass1.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/

10-12 20:43