Python,循环导入后检查对象的类型

时间:2011-07-22 19:17:29

标签: python import circular-dependency

这是两个文件,foo.py和bar.py bar.py有......

from foo import *

...在顶部。 bar.py使用n foo定义的类型。

从foo导入bar.py时,我无法确定对象的类型。 查看下面的示例为什么对isinstance的调用返回False? 如何检查这些类型是否相同?

谢谢,

===== foo.py =====

#!/usr/bin/env python

class Spam(object):
    def __init__(self, x):
        self.x = x
    def funcA(self):
        print 'function a'
    def __str__(self):
        return 'Spam object %s' % repr(self.x)

class Eggs(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
    def funcB(self):
        print 'function b'
    def __str__(self):
        return "Eggs object (%s, %s, %s)" % (repr(self.x), repr(self.y), repr(self.z))

def main(fname):
    if not fname.endswith('.py'):
        raise Exception("Must be a .py file")
    module = __import__(fname[:-3])
    for item in module.DATA:
        if isinstance(item, Spam):
            item.funcA()
        elif isinstance(item, Eggs):
            item.funcB()
        print item

if __name__ == '__main__':
    import sys
    for fname in sys.argv[1:]:
        main(fname)
    sys.exit(0)

===== bar.py =====

from foo import *
DATA=[
Spam("hi"),
Spam("there"),
Eggs(1, 2, 3),
]

2 个答案:

答案 0 :(得分:1)

使用:

if __name__ == '__main__':
    import sys
    main('bar.py')
    sys.exit(0)

我得到了:

Spam object 'hi'
Spam object 'there'
Eggs object (1, 2, 3)

代码和主要功能移动到不同的文件并导入foo并运行

#-- main.py --

import foo

def main(fname):
    if not fname.endswith('.py'):
        raise Exception("Must be a .py file")
    module = __import__(fname[:-3])
    for item in module.DATA:
        if isinstance(item, foo.Spam):
            item.funcA()
        elif isinstance(item, foo.Eggs):
            item.funcB()
        print item

if __name__ == '__main__':
    import sys
    main('bar.py')
    sys.exit(0)

答案 1 :(得分:1)

您是否尝试过打印SpamEggs以及item的类型?

Spam is <class '__main__.Spam'>
Eggs is <class '__main__.Eggs'>
type of item is <class 'foo.Spam'>
Spam object 'hi'
type of item is <class 'foo.Spam'>
Spam object 'there'
type of item is <class 'foo.Eggs'>
Eggs object (1, 2, 3)

foo.py模块运行两次,一次作为主程序,一次由bar.py导入。

在主程序中,SpamEggs定义为__main__.Spam__main__.Eggs

在导入的模块中,SpamEggs定义为foo.Spamfoo.Eggs

__main__.Spam!= foo.Spam__main__.Eggs!= foo.Eggs