确定对象的类型?

2157 投票
15 回答
2254371 浏览
提问于 2025-04-15 19:02

有没有简单的方法来判断一个变量是列表、字典还是其他类型的东西呢?

15 个回答

45

使用 try...except 这种方式可能更符合 Python 的风格。这样的话,如果你有一个像列表一样“嘎嘎叫”的类,或者像字典一样“嘎嘎叫”的类,它都会正常工作,不管它的真实类型是什么。

为了更清楚地说明,区分变量类型的推荐方法叫做 鸭子类型:只要一个变量能响应你需要的方法(和返回值),就可以把它当成你希望它是什么的类型。例如,如果你有一个类,它重载了方括号操作符,并使用 getattrsetattr,但内部实现有点奇怪,那么如果它想模仿字典,表现得像字典就是合适的。

另外,使用 type(A) is type(B) 来检查类型的问题在于,如果 AB 的子类,这个检查会返回 false,而实际上你可能希望它返回 true。如果一个对象是列表的子类,它应该像列表一样工作:按照另一个答案中展示的方式检查类型会导致这个问题。(不过,使用 isinstance 是可以的)。

221

使用 type()

>>> a = []
>>> type(a)
<type 'list'>
>>> f = ()
>>> type(f)
<type 'tuple'>
2331

有两个内置函数可以帮助你识别一个对象的类型。如果你想知道一个对象的确切类型,可以使用type(),而如果你想检查一个对象的类型是否属于某种类型,可以使用isinstance()。通常情况下,你会更常用isinstance(),因为它非常强大,并且支持类型继承。


要获取一个对象的实际类型,你可以使用内置的type()函数。只需将对象作为唯一参数传入,就会返回该对象的类型:

>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True

当然,这也适用于自定义类型:

>>> class Test1 (object):
        pass
>>> class Test2 (Test1):
        pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True

需要注意的是,type()只会返回对象的直接类型,而无法告诉你关于类型继承的信息。

>>> type(b) is Test1
False

为了处理这个问题,你应该使用isinstance函数。这同样适用于内置类型:

>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True

isinstance()通常是确保对象类型的首选方式,因为它也会接受派生类型。所以,除非你真的需要类型对象(出于某种原因),否则使用isinstance()type()更好。

另外,isinstance()的第二个参数还可以接受一个类型的元组,这样你可以一次检查多个类型。如果对象属于这些类型中的任何一个,isinstance就会返回真:

>>> isinstance([], (tuple, list, set))
True

撰写回答