确定对象的类型?
有没有简单的方法来判断一个变量是列表、字典还是其他类型的东西呢?
15 个回答
使用 try
...except
这种方式可能更符合 Python 的风格。这样的话,如果你有一个像列表一样“嘎嘎叫”的类,或者像字典一样“嘎嘎叫”的类,它都会正常工作,不管它的真实类型是什么。
为了更清楚地说明,区分变量类型的推荐方法叫做 鸭子类型:只要一个变量能响应你需要的方法(和返回值),就可以把它当成你希望它是什么的类型。例如,如果你有一个类,它重载了方括号操作符,并使用 getattr
和 setattr
,但内部实现有点奇怪,那么如果它想模仿字典,表现得像字典就是合适的。
另外,使用 type(A) is type(B)
来检查类型的问题在于,如果 A
是 B
的子类,这个检查会返回 false
,而实际上你可能希望它返回 true
。如果一个对象是列表的子类,它应该像列表一样工作:按照另一个答案中展示的方式检查类型会导致这个问题。(不过,使用 isinstance
是可以的)。
使用 type()
:
>>> a = []
>>> type(a)
<type 'list'>
>>> f = ()
>>> type(f)
<type 'tuple'>
有两个内置函数可以帮助你识别一个对象的类型。如果你想知道一个对象的确切类型,可以使用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