Python,循环导入后检查对象类型
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
你有没有试过打印一下 Spam
、Eggs
还有 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
导入时运行。
在主程序中,Spam
和 Eggs
被定义为 __main__.Spam
和 __main__.Eggs
。
在被导入的模块中,Spam
和 Eggs
被定义为 foo.Spam
和 foo.Eggs
。
__main__.Spam
和 foo.Spam
是不一样的,__main__.Eggs
和 foo.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)