2011-04-05 53 views
0

我在python中有鑄造問題。在python中鑄造

我在文件module_A.py的方法:

import Common.Models.Pax as Pax 

def verify_passangers_data(self,paxes): 
    for i in range(len(paxes)): 
     pax=paxes[i] 

這裏是我的Pax.py

class Pax: 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
    #---------------------------------------------------------------------- 



class Adult(Pax): 

    def __init__(self,last_day_of_travel,first_name,last_name,nationality,address=None): 
     self.birth_day=datetime.today() - timedelta(days = random.randrange(6563, 20793-(date.today()-last_day_of_travel).days)) 
     self.first_name=first_name 
     self.last_name=last_name 
     self.nationality=nationality 
     self.address=address 

這是我的另一個模塊中創建集合(module_C.py):

paxes=[] 
     paxes.append(Pax.Adult(last_day_of_travel,'FirstName','LastName',Nationality.Poland,DataRepository.addresses['Default'])) 

但是,看看我的輸出從調試探頭(在翼ide)

>>> type(pax) 
<class 'Common.Models.Pax.Adult'> 
>>> pax is Common.Models.Pax.Adult 
Traceback (most recent call last): 
    File "<string>", line 1, in <fragment> 
builtins.NameError: name 'Common' is not defined 

我該如何檢查pax是否是Adult的實例?

+3

看不出這有什麼關係鑄造。 – 2011-04-05 17:01:14

+0

'NameError:name'Common'未定義'表示您沒有導入'Common' ... – 2011-04-05 17:14:31

回答

3

How can I check is pax is instance of Adult?

使用isinstance功能:

isinstance(pax, Common.Models.Pax.Adult) 

讓你導入的類,但(例如,import Common.Models.Pax)。 (雖然純粹主義者會認爲很少需要檢查Python對象的類型,但Python是動態類型的,所以通常應該檢查一下對象是否響應特定的方法調用,而不是檢查它的類型但你可能有一個很好的理由,需要檢查的類型,太)

+0

「」「所以你通常應該檢查對象是否響應特定的方法調用,而不是檢查它的類型」「」 - 非常狂野的聲明 – 2011-04-05 17:01:44

+3

@RestRisiko:不,這正是鴨子打字的意思。如果你只是想「隱藏()」它們,沒有人關心這些'widgets'是否是'FooDialog'的實例。 – delnan 2011-04-05 17:06:27

0

可以使用isinstance

isinstance(pax, Common.Models.Pax.Adult) 

或內置type功能:

type(pax) == Common.Models.Pax.Adult 

當然,您將不得不導入模塊,以便定義Common.Models.Pax.Adult。這就是爲什麼你最終得到這個錯誤。

+0

請注意,如果B是A的一個子類,並且'b = B()',那麼'isinstance(b,A)'將爲True,而'type(b)== A'將爲False。 – 2011-04-05 19:10:01

+0

好點,在他的代碼中,我會推薦使用'type()'。 – Aphex 2011-04-05 19:50:16

0

你需要以引用它已經導入的類型:

>>> x is socket._fileobject 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'socket' is not defined 
>>> import socket 
>>> x is socket._fileobject 
False 

想必,你所獲得的情況下從其他電話指向pax,所以你沒有實際進口類到您的命名空間。

另外,is測試對象標識(這些是相同的對象?),而不是類型。你想要instanceof(pax,Common...)

0

您有兩個錯誤,第一個是使用is而不是isinstance函數。其次是試圖通過它的絕對名稱來引用模塊,但你已經用別名導入它。

因此你應該做的是:

isinstance(pax,Pax.Adult)