这是两个文件,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),
]
答案 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)
您是否尝试过打印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
。