python type(object) 与 isinstance(object, base) 区别

python type(object) 与 isinstance(object, base) 区别

python是一种解释型动态语言,所以定义变量的时候不需要强制指定其类型,解释器在运行程序的时候会自动检测,并为某些操作提供隐式的类型转换,这也就是为什么动态语言运行较慢的一个原因。

然而,程序有时候需要进行类型检查,比如函数参数类型的检查,这样可以避免一些低级bug并提高程序的安全性,即提高了代码的robust。类型检测常用的方法是type(object)isinstance(object, base)

比如定义一个类MyStr,其父类为str。

class MyStr(str):
    pass
ss = MyStr()

得到的结果将会是:

type(ss) == str #返回False,但实际上对象ss是一个str。
isinstance(ss, str) #返回True

可见,type只返回了生成该instance的类型,即MyStr,忽略了继承来的父类型str,但isinstance可以回溯到每一个父类,这也是我们所希望的结果。以下两种方式也可实现isinstance的功能,但比较繁琐。

issubclass(type(ss), str)
type(ss) in ([str] + str.__subclasses__())

如果想让代码更加pythonic,那就用isinstance吧!isinstance的第二个位置参数可以是单个类型或由多个类型组成的一个tuple,只要object所属类型属于tuple里的任意一个元素,返回就为True。可以看看isinstance的帮助文档,比如下面:

isinstance(obj, class_or_tuple, /)
Return whether an object is an instance of a class or of a subclass thereof.

A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
or ...`` etc.

总结、

如果想知道一个object的直接上级是谁,可用type(object);

如果想知道object是否是base的一个instance或者是base的一个subclass,可用isinstance(object, base);

一般用isinstance(object, base),少用type(object)。

但是最pythonic的方法是不要进行类型检查,详情可查看Duck Typing(鸭子类型)!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(内容同步更新到微信公众号python数学物理,微信号python_math_physics
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值