2011-07-22 44 views
1

後,這裏有兩個文件,foo.py和bar.py bar.py有...Python中,檢查對象的類型圓形進口

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) 

編輯:主要代碼和主要功能adifferent文件並導入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) 
+0

正確...我想調用funcA和funcB來打印其他東西 –

+0

看上面更新 – fabrizioM

1

您是否嘗試打印Spam,​​和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) 

當它是由bar.py進口的foo.py模塊作爲主程序運行兩次,一次一次。

在主程序中,Spam和​​定義爲__main__.Spam__main__.Eggs

在導入的模塊,Spam和​​被定義爲foo.Spamfoo.Eggs

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