Python开发——isinstance()函数

1. 基本概念

        `isinstance()` 函数是 Python 内置的函数,用于判断一个对象是否为指定类型或指定类型的子类。其语法如下:

isinstance(object, classinfo)

        object:表示要判断类型的对象。

        classinfo:可以是单个类型或由多个类型组成的元组。如果 `object` 是其中任意一个类型或其子类的实例,则返回 `True`,否则返回 `False`。

2. 基本用法

2.1 判断单个类型

# 判断整数类型
print(isinstance(10, int))  # 输出:True

# 判断字符串类型
print(isinstance("hello", str))  # 输出:True

# 判断列表类型
print(isinstance([1, 2, 3], list))  # 输出:True

# 判断字典类型
print(isinstance({"key": "value"}, dict))  # 输出:True

# 判断自定义类类型
class MyClass:
    pass

obj = MyClass()
print(isinstance(obj, MyClass))  # 输出:True

2.2 判断多个类型

        可以使用元组传递多个类型,如果对象是其中任意一个类型的实例,则返回 `True`。

# 判断对象是否为整数或字符串类型
print(isinstance(10, (int, str)))  # 输出:True
print(isinstance("hello", (int, str)))  # 输出:True
print(isinstance(3.14, (int, str)))  # 输出:False

2.3 判断子类

        `isinstance()` 可以用来判断一个对象是否为某个类型的子类的实例。

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(isinstance(dog, Animal))  # 输出:True
print(isinstance(dog, Dog))     # 输出:True

3. 实际应用

3.1 类型检查和条件执行

        在处理函数参数或用户输入时,使用 `isinstance()` 进行类型检查,确保参数或输入符合预期类型。

def process_data(data):
    if isinstance(data, list):
        print("处理列表数据")
    elif isinstance(data, dict):
        print("处理字典数据")
    elif isinstance(data, str):
        print("处理字符串数据")
    else:
        print("未知数据类型")

process_data([1, 2, 3])  # 输出:处理列表数据
process_data({"key": "value"})  # 输出:处理字典数据
process_data("hello")  # 输出:处理字符串数据
process_data(42)  # 输出:未知数据类型

3.2 类型多态

        在实现多态行为时,使用 `isinstance()` 确定对象的类型,以便调用适当的方法。

class Animal:
    def speak(self):
        pass

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

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

def make_sound(animal):
    if isinstance(animal, Dog):
        animal.speak()
    elif isinstance(animal, Cat):
        animal.speak()
    else:
        print("未知动物")

dog = Dog()
cat = Cat()
make_sound(dog)  # 输出:Woof!
make_sound(cat)  # 输出:Meow!

3.3 数据验证

        在数据处理和验证过程中,使用 `isinstance()` 检查数据类型,确保数据符合预期格式。

def validate_data(data):
    if not isinstance(data, (int, float)):
        raise ValueError("数据类型必须为整数或浮点数")
    print("数据有效")

validate_data(42)     # 输出:数据有效
validate_data(3.14)   # 输出:数据有效
validate_data("hello")  # 抛出异常:ValueError: 数据类型必须为整数或浮点数

3.4 检查继承关系

        在面向对象编程中,使用 `isinstance()` 检查对象是否是某个类的实例或其子类的实例,以确保对象符合预期的继承关系。

class Shape:
    pass

class Circle(Shape):
    pass

class Square(Shape):
    pass

def check_shape(shape):
    if isinstance(shape, Shape):
        print("是一个形状对象")
    else:
        print("不是一个形状对象")

circle = Circle()
square = Square()
check_shape(circle)  # 输出:是一个形状对象
check_shape(square)  # 输出:是一个形状对象
check_shape(42)      # 输出:不是一个形状对象

3.5 使用 `isinstance()` 避免类型错误

        在处理涉及多种类型的复杂逻辑时,使用 `isinstance()` 可以有效避免类型错误,提高代码的健壮性。

def add(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise TypeError("参数必须为数字类型")
    return a + b

print(add(3, 4))       # 输出:7
print(add(3.5, 2.5))   # 输出:6.0
print(add(3, "4"))     # 抛出异常:TypeError: 参数必须为数字类型

4. 复杂场景中的应用

4.1 检查对象的多种类型

        在一些复杂场景中,可能需要检查对象是否属于多种类型之一。

def process_item(item):
    if isinstance(item, (int, float)):
        print(f"数值类型:{item}")
    elif isinstance(item, (list, tuple)):
        print(f"序列类型:{item}")
    elif isinstance(item, dict):
        print(f"字典类型:{item}")
    else:
        print(f"未知类型:{item}")

process_item(10)          # 输出:数值类型:10
process_item(3.14)        # 输出:数值类型:3.14
process_item([1, 2, 3])   # 输出:序列类型:[1, 2, 3]
process_item((4, 5, 6))   # 输出:序列类型:(4, 5, 6)
process_item({"a": 1})    # 输出:字典类型:{'a': 1}
process_item("hello")     # 输出:未知类型:hello

4.2 检查自定义类和子类

        在面向对象编程中,使用 `isinstance()` 来检查对象是否属于自定义类或其子类。

class Vehicle:
    pass

class Car(Vehicle):
    pass

class Bike(Vehicle):
    pass

def check_vehicle(vehicle):
    if isinstance(vehicle, Vehicle):
        print("这是一个交通工具")
    if isinstance(vehicle, Car):
        print("这是一个汽车")
    if isinstance(vehicle, Bike):
        print("这是一个自行车")

car = Car()
bike = Bike()
check_vehicle(car)  # 输出:这是一个交通工具 这是一个汽车
check_vehicle(bike) # 输出:这是一个交通工具 这是一个自行车

4.3 结合 `isinstance()` 和 `getattr()`

        在动态属性访问时,结合 `isinstance()` 和 `getattr()` 使用,可以更灵活地处理对象属性。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def print_attribute(obj, attr_name):
    if isinstance(obj, Person):
        attr_value = getattr(obj, attr_name, "属性不存在")
        print(f"{attr_name}: {attr_value}")
    else:
        print("对象不是Person类")

p = Person("Alice", 30)
print_attribute(p, "name")  # 输出:name: Alice
print_attribute(p, "age")   # 输出:age: 30
print_attribute(p, "height")# 输出:height: 属性不存在

4.4 多层嵌套类型检查

        在处理嵌套数据结构时,可以使用 `isinstance()` 进行多层类型检查。

nested_dict = {
    "a": {"b": {"c": 42}}
}

def get_nested_value(d, keys):
    for key in keys:
        if isinstance(d, dict):
            d = d.get(key, "键不存在")
        else:
            return "不是一个字典"
    return d

keys = ["a", "b", "c"]
print(get_nested_value(nested_dict, keys))  # 输出:42

keys = ["a", "x", "c"]
print(get_nested_value(nested_dict, keys))  # 输出:键不存在

        通过这些示例和扩展,希望你能更全面地理解和应用 `isinstance()` 函数,以提高代码的健壮性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 命令历史、补全和正则表达式

1.命令历史就和windows的ctrlz一个概念,就是返回上一次的命令。 按下小键盘上下切换 ctrlc可以终止本次输入,进行下一次输入。 2.tab键可以自动补全(有点鸡肋) 3.正则表达式 类似于word的快速搜索,Linux也是用*和…

浅析C++引用

浅析C引用"&" ​ C中引入了一个新的语言特性——引用(&),它表示某一对象的别名,对象与该对象的引用都是指向统一地址。那么我们就来看看关于引用的一些知识点吧🧐 特性 引用在定义时必须初始化一个变量可以有多个引用引…

zdppy_api+vue3+antd前后端分离开发,使用描述列表组件渲染用户详情信息

后端代码 import api import upload import time import amcomment import env import mcrud import amuserdetailsave_dir "uploads" env.load(".env") db mcrud.new_env()app api.Api(routes[*amcomment.get_routes(db),*amuserdetail.get_routes(db…

记一次微信小程序逆向

扫码领取网安教程 遇到瓶颈了,不知道该干什么,突然想到学校的小程序 闲来无事就看一看 抓包下来的数据是这样的,嗯,下机(hhh 一、反编译程序 加密嘛,之前抓了看到是加密就放弃了,现在重新弄一…

轻松转换!两款AI工具让word秒变ppt!

想把Word文档一键生成PPT,过去有一个很常见的做法:先在Word文档中设置标题样式,通过标题样式来分隔每一部分,之后导出为PPT,就能得到一份PPT的雏形,但这种方法无法对PPT自动进行美化,即得到的只…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例: function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在,直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组,遍历数组每个元素if (Array.isArray(obj)) {obj…

【Python】一文向您详细介绍 np.inner()

【Python】一文向您详细介绍 np.inner() 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕,曾…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式,能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化,使其在不同时间…

【学术会议征稿】2024年第四届工商管理与数据科学学术会议(BADS 2024)

2024年第四届工商管理与数据科学学术会议(BADS 2024) 2024 4th International Conference on Business Administration and Data Science 2024年第四届工商管理与数据科学学术会议(BADS 2024)将于2024年10月25-27日在新疆喀什召开,由喀什大学支持本次会议。会议旨…

Mapboxgl 根据 AWS 地形的高程值制作等高线

更多精彩内容尽在dt.sim3d.cn&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 使用mapboxgl 3.0版本&#xff0c;根据 AWS 地形图块的高程值制作等高线&#xff0c;源码如下&#xff1a; <!DOCTYPE html> &…

OV证书签发一般要多久?

OV证书&#xff0c;即组织验证型SSL证书&#xff0c;的签发流程涉及多个阶段&#xff0c;其具体时间取决于多种因素。OV证书的签发一般需要1-3个工作日&#xff0c;这个过程可以分为以下几个阶段&#xff1a; 1、选择和购买证书&#xff1a; 用户需要在SSL证书服务商处选择合适…

AnaPico为众多工厂产线老化测试提供高效经济的微波解决方案

在电子设备的生产中&#xff0c;老化测试在整个使用寿命期间的可靠性和对声明参数的保证起着重要作用&#xff0c;尤其是在特殊应用&#xff08;国防和航天工业、电信、医药等&#xff09;方面。即使经过成功的参数和功能测试&#xff0c;在实际操作条件下使用时也有可能出现设…

【JSP+Servlet+Maven】——优质外卖订餐系统之概论部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【Linux】进程的概念 + 查看进程

前言&#xff1a; 在前面我们学习了Liunx的基本指令和权限相关知识&#xff0c;还有基本工具的使用&#xff0c;有了以上的基础知识我们本章将正式接触Linux操作系统。 目录 1.冯诺依曼体系结构1.1 内存存在的意义1.2 程序加载到内存的含义1.3 程序的预加载&#xff1a; 2 .认识…

python读取指定文件夹下的图片(glob获取)

python读取指定文件夹下的图片&#xff08;glob获取&#xff09; 定义traverse_images函数&#xff0c;仅需要改变下根路径即可 glob是python中用来查找符合特定规则的文件路径名的函数 import os from glob import globdef traverse_images (folder_path):image_formats …

Google账号输入用户名和密码后提醒要到手机通知点是,还要点击数字,但是我手机收不到

有一些朋友换了一个新的电脑后手机登录谷歌账号时&#xff0c;用户名和密码都正确输入以后&#xff0c;第三步弹出一个提示&#xff0c;要在手机上的通知栏点击是&#xff0c;并且点击手机上相应的数字才能继续登录。 但是自己的手机上下拉通知栏却没有来自谷歌的通知&#xf…

mkv怎么改成mp4格式?把mkv改成MP4的几种方法介绍

mkv怎么改成mp4格式&#xff1f;将mkv格式的视频文件转换为MP4格式是许多用户常常需要解决的问题&#xff0c;尤其是在不同设备之间传输和播放视频时。mkv是一种灵活且功能强大的多媒体容器格式&#xff0c;能够包含多种视频、音频和字幕轨道。然而&#xff0c;尽管其优势显著&…

前端web在线PPT编辑器-PPTLIST

哈喽&#xff0c;大家好&#xff0c;今天给大家介绍一款的在线的PPT编辑器开源框架-PPTLIST&#xff1b;他是一个基于 Vue3.x TypeScript 的在线演示文稿&#xff08;幻灯片&#xff09;应用&#xff0c;还原了大部分 Office PowerPoint 常用功能&#xff0c;支持 文字、图片、…

MSP学习

一、迁移资源调研 完成导入&#xff0c;类似完成选型分析 离线工具调研 账单 二、迁移计划 1、

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…