Python关于isinstance函数的解析(全)

前言

这个函数有点类似type函数的定义
type判断函数类型是什么,而isinstance是通过判断对象是否是已知的类型
但是isinstance比type高级一些(功能上的差异)

具体差异:

  • type() ,不考虑继承关系(子类不是父类类型)
  • isinstance() ,考虑继承关系(子类是父类类型)

1. 基本语法

其基本函数的源码如下:

def isinstance(x, A_tuple): # real signature unknown; restored from __doc__
    """
    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.
    """
    pass

isinstance(object, classinfo)
object :实例对象
classinfo :类型可以是 直接或间接类名、基本类型以及元组

2. 函数运用

基础版的运用:

a = 10086
isinstance (a,int)  # true

isinstance (a,str) # false

isinstance (a,(str,int,list))    # 只要满足元组类型中的其中一个即可,答案是满足,所以为true

关于python的数据类型具体有哪些
可查看我之前的文章:python数据类型详细分析(附代码)

高阶版运用:

s = () # 定义一个元组类型
isinstance(s,tuple) # true
isinstance(s,list) # false

s1 = [] # 定义一个列表类型
isinstance(s1,list) # true

s2 = {} # 定义一个字典类型
isinstance(s2,dict) # true

# 混合类型判断,通过for索引取值判断
isinstance(s,(tuple,list,dict)) 

3. 实战

结合python的web开发
定义一个字段来获取字段值

@python_2_unicode_compatible
class xx(Document):
    name = StringField(required=False, help_text=u"名字")
    age = StringField(required=False, help_text=u"年龄")

    # 日志中显示的字段
    _show_log = ('name', 'age')

    def __str__(self):
        return u"码农研究僧的名字:{name1},年龄:{name2}".format(name1=self.name,name2=self.age)

关于format的函数可看我之前的文章:python中format格式化函数(全)

通过@log日志注解来获取

@log('addition')
def yy(name,age):
    project = AudioBlack(name,age)
    。。。
  	return project

在log日志的注解中定义如下:(伪代码)

def log(operation=''):
    def _decorate(func):
        @wraps(func)
        def _wraps(*args, **kwargs):
            x, y = kwargs.pop('log', True), kwargs.pop('operator', None)
            z = func(*args, **kwargs)
            # 默认记录日志
            if isinstance(z, (Document)) and x and y:
                。。。。
            return z
            
        return _wraps
    return _decorate

大致逻辑如下:

在某个地方专门调用yy这个函数,yy这个函数通过注解触发日志,之后通过调用xx这个类(这些都是开发的内容)

回归今天的重点:
log日志内部中有一个if isinstance(z, (Document))函数
输出如下:<class 'projects.models.project.xx'>

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年3月5日 下午8:31
下一篇 2023年3月5日 下午8:32

相关推荐