Python中的类型转换

0 投票
4 回答
2005 浏览
提问于 2025-04-16 15:08

我在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']))

但是,看看我在调试工具(在wing 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的实例呢?

4 个回答

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

假设你是通过其他方法获得了指向的实例,所以你实际上并没有把这个类导入到你的命名空间里。

另外,is是用来测试对象的身份(也就是这两个对象是不是同一个),而不是用来测试类型的。你应该使用instanceof(pax,Common...)

0

你有两个错误,首先是用错了,应该用 isinstance 函数,而不是 is。第二个错误是你试图用模块的完整名字来引用它,但你已经用别名导入了这个模块。

所以你应该这样做:

isinstance(pax,Pax.Adult)
3

我怎么检查 pax 是否是 Adult 的实例?

可以使用 isinstance 函数:

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

不过,你得确保已经导入了这个类,比如说 import Common.Models.Pax

(虽然有些人认为,检查 Python 对象的类型其实很少有必要。因为 Python 是动态类型的,通常你应该检查一个对象是否能响应某个方法调用,而不是单纯检查它的类型。不过,有时候你可能确实有理由需要检查类型。)

撰写回答