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

1 投票
2 回答
592 浏览
提问于 2025-04-16 22:05
from foo import *

这里有两个文件,分别是 foo.py 和 bar.py。

bar.py 的开头有一些内容。bar.py 使用了在 foo.py 中定义的类型。

当我从 foo.py 导入 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 个回答

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__.Spamfoo.Spam 是不一样的,__main__.Eggsfoo.Eggs 也是不一样的。

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)

撰写回答