问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

Python中为什么推荐使用isinstance来进行类型判断

提问网友 发布时间:2022-04-22 12:40
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2022-04-06 05:04
Python在定义变量的时候不用指明具体的的类型,解释器会在运行的时候会自动检查 变量的类型,并根据需要进行隐式的类型转化。因为Python是动态语言,所以一般情 况下是不推荐进行类型转化的。比如"+"操作时,如果加号两边是数据就进行加法操 作,如果两边是字符串就进行字符串连接操作,如果两边是列表就进行合并操作,甚 至可以进行复数的运算。解释器会在运行时根据两边的变量的类型调用不同的内部方法。 当加号两边的变量类型不一样的时候,又不能进行类型转化,就会抛出TypeError的异常。
但是在实际的开发中,为了提高代码的健壮性,我们还是需要进行类型检查的。而进行 类型检查首先想到的就是用type(),比如使用type判断一个int类型。
import typesif type(1) is types.Integer: print('1是int类型')else: print('1不是int类型')

上面的程序会输出:1是int类型
我们在types中可以找到一些常用的类型,在2.7.6中显示的结果:
types.BooleanType # bool类型types.BufferType # buffer类型types.BuiltinFunctionType # 内建函数,比如len()types.BuiltinMethodType # 内建方法,指的是类中的方法types.ClassType # 类类型types.CodeType # 代码块类型types.ComplexType # 复数类型types.DictProxyType # 字典代理类型types.DictType # 字典类型types.DictionaryType # 字典备用的类型types.EllipsisTypetypes.FileType # 文件类型types.FloatType # 浮点类型types.FrameTypetypes.FunctionType # 函数类型types.GeneratorType
types.GetSetDescriptorTypetypes.InstanceType # 实例类型types.IntType # int类型types.LambdaType # lambda类型types.ListType # 列表类型types.LongType # long类型types.MemberDescriptorTypetypes.MethodType # 方法类型types.MoleType # mole类型types.NoneType # None类型types.NotImplementedTypetypes.ObjectType # object类型types.SliceTypehtypes.StringType # 字符串类型types.StringTypes
types.TracebackType
types.TupleType # 元组类型types.TypeType # 类型本身types.UnboundMethodTypetypes.UnicodeType
types.XRangeType

在Python 3中,类型已经明显减少了很多
types.BuiltinFunctionType
types.BuiltinMethodType
types.CodeType
types.DynamicClassAttribute
types.FrameType
types.FunctionType
types.GeneratorType
types.GetSetDescriptorType
types.LambdaType
types.MappingProxyType
types.MemberDescriptorType
types.MethodType
types.MoleType
types.SimpleNamespace
types.TracebackType
types.new_class
types.prepare_class

但是我们并不推荐使用type来进行类型检查,之所以把这些类型列出来,也是为了扩展知识 面。那为什么不推荐使用type进行类型检查呢?我们来看一下下面的例子。
import typesclass UserInt(int): def __init__(self, val=0): self.val = int(val)i = 1n = UserInt(2)print(type(i) is type(n))

上面的代码输出:False
这就说明i和n的类型是不一样的,而实际上UserInt是继承自int的,所以这个判断是存在问题的, 当我们对Python内建类型进行扩展的时候,type返回的结果就不够准确了。我们再看一个例子。
class A(): passclass B(): passa = A()b = B()print(type(a) is type(b))

代码的输出结果: True
type比较的结果a和b的类型是一样的,结果明显是不准确的。这种古典类的实例,type返回的结果都 是一样的,而这样的结果不是我们想要的。对于内建的基本类型来说,使用tpye来检查是没有问题的, 可是当应用到其他场合的时候,type就显得不可靠了。这个时候我们就需要使用isinstance来进行类型 检查。
isinstance(object, classinfo)

object表示实例,classinfo可以是直接或间接类名、基本类型或者有它们组成的元组。
>>> isinstance(2, float)
False
>>> isinstance('a', (str, unicode))
True
>>> isinstance((2, 3), (str, list, tuple))
True

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关推荐
  • isinstance函数定义与用法汇总

    isinstance函数定义与用法汇总

    isinstance函数定义与用法汇总:英文文档:isinstance(object, classinfo)Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object
    查看详情
  • Python中类型检查的详细介绍

    Python中类型检查的详细介绍

    Python中类型检查的详细介绍:前言大家都知道Python 是一门强类型、动态类型检查的语言。所谓动态类型,是指在定义变量时,我们无需指定变量的类型,Python 解释器会在运行时自动检查。与静态类型语言(如 C 语言)相比,这不仅仅是少写了几个类型声明字符:#include <stdl
    查看详情
魔兽世界萨满坐骑问题 魔兽 7.2 SM职业坐骑任务怎么接不到? python3 用isinstance()检查unicode编码报错 wow萨满在哪里买坐骑?初级坐骑。。 Python中isinstance()的用法? 德莱尼萨满多少级才会有坐骑呢? python 3 isinstance函数的用法,下面的代码如何解释? 魔兽世界萨满30级的坐骑在萨满地方购买? WOW60级萨满可以有什么坐骑 萨满有了什么成就就能做职业坐骑了 wow坐骑先知的狂怒风暴怎么得 魔兽世界萨满都可以有那些坐骑 wow坐骑先知的狂怒风暴怎么得 wow7.2萨满各职业史诗专属坐骑怎么获取 前两天别人帮我订的机票在携程订的,怎么去网上查询查不到有这个订单呢 这两个字的拼音怎么打? 这两个字怎么打?拼音 只有(zh)这个拼音的是哪个字 ″一只"的拼音是什么? “几只”的拼音是什么? 德莱尼萨满 坐骑 Python中isinstance()的用法? 萨满坐骑哪里买 python中isinstance(x,complex)是什么意思 魔兽世界兽人萨满坐骑 Python中的input()、isinstance()函数如何使用? 魔兽世界:飞行坐骑的出现,改变了游戏方式,你知道吗? python 语句isinstance是在判断什么?type是什么类型 萨满有幽冥狼还用坐骑吗? Python中用isinstance判断多个变量的类型,如何简洁表述呢 40级的萨满骑什么坐骑好? 求魔兽世界各职业介绍 有骑宠和飞行器么 python如何判断类型 isinstance python 怎么判断参数是一个函数对象 WOW7.2萨满职业坐骑怎么得 萨满职业坐骑任务流程攻略 python3中怎么判断传入的参数是否是unicode python3怎样检查网站构建的技术类型 istouching在python里什么意思 zbrush 如何调成对称画笔 zbrush 怎样编辑过程中对称
Top