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

本文介绍了Python内置函数isinstance的使用方法,对比了与type的区别,并展示了如何利用isinstance进行类型检查和处理多态场景,包括实例化、类型元组和动态类型判断在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这个函数有点类似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

参数:

  • 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. Demo

一、 基本语法:

class A:
    pass

class B(A):
    pass

obj1 = A()
obj2 = B()

print(isinstance(obj1, A))  # True
print(isinstance(obj1, B))  # False
print(isinstance(obj2, A))  # True
print(isinstance(obj2, B))  # True

二、类型元组:

x = 5
print(isinstance(x, (int, float)))  # True
print(isinstance(x, (str, list)))   # False

三、处理多态:

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def animal_sound(animal):
    if isinstance(animal, Animal):
        return animal.speak()
    else:
        return "Not a valid animal"

dog = Dog()
cat = Cat()

print(animal_sound(dog))  # Woof!
print(animal_sound(cat))  # Meow!
print(animal_sound("rabbit"))  # Not a valid animal

4. 实战

结合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'>

### Python `def` 函数练习题 #### 题目一:字符串处理函数 编写一个名为 `func` 的函数,该函数接收一个列表作为参数。遍历此列表中的每一个元素并将其转换成字符串形式。如果某个字符串中含有空格,则返回含有空格的那个字符串;如果没有发现含空格的字符串则返回特定消息。 ```python def func(a): for i in a: i = str(i) if ' ' in i: return ('空格:', i) return ('没空格') # 如果没有找到带空格的项就返回这条信息[^1] ``` #### 题目二:质数检测器 设计一个叫做 `zhishu` 的函数来检验给定整数是否为质数。利用for循环迭代可能存在的因子,并通过条件语句决定最终输出的结果。 ```python def zhishu(num): for i in range(2, num // 2 + 1): if num % i == 0: return f"{num}不是质数" return f"{num}是质数" print(zhishu(5)) # 测试案例: 输出 "5是质数"[^2] ``` #### 题目三:字典键值截断显示 实现一个名称为 `func3` 的功能,它接受一个字典类型的对象做参数。对于传入的数据结构里的每一项,只保留前两位字符/数字(如果是序列类型的话),最后再把修改后的数据集组合起来形成新的字典返回出去。 ```python def func3(dct): result = {} for key, value in dct.items(): if isinstance(value, (list, tuple)): result[key] = value[:2] elif isinstance(value, str): result[key] = value[:2] else: result[key] = value return result print(func3({'k1': 'abcdef', 'k2': [1, 2, 3, 4], 'k3': ('a', 'b', 'c')})) # 结果 {'k1': 'ab', 'k2': [1, 2], 'k3': ('a', 'b')} ``` #### 题目四:可变长度参数收集 探索如何使用带有单星号(*)和双星号(**)标记的形式参数来捕获任意数量的位置实参以及关键字实参。这有助于理解Python中灵活传递多个参数的方式。 ```python def demo_func(*args, **kwargs): print(f"位置参数集合:{args}") print(f"关键字参数集合:{kwargs}") demo_func(1, 2, name="Alice", age=30) # 展示调用效果[^4] ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值