2011-04-05 79 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)