86、Python之鸭子类型:即便行为大于类型,还是要聊一下类型转换

news2024/9/30 9:19:35

引言

我们的最近几篇文章一直在聊的是鸭子类型,以及支撑鸭子类型相关的魔术方法的内容。其实,鸭子类型的本质在于“行为大于类型”。但是,并不是说类型不重要,只是在特定领域中,行为本身高于类型形式,或者说,行为的表达并应当受制于具体的类型。今天这篇文章,想就鸭子类型之外,Python在类型本身上的一些特性——类型的转换。

本文的主要内容有:

1、什么是类型转换

2、内置类型的类型转换

3、自定义类型的类型转换

什么是类型转换

每种编程语言中,都有“类型”的概念。类型与行为的关系,有点像《论语》中“文”和“质”的关系。不能绝对的说,哪个一定更加重要。

两者的关系,更应该是“质胜文则野,文胜质则史,文质彬彬,然后君子”的感觉。

有类型,就一定存在类型转换。

所谓的“类型转换”,是指将一种类型转换为另一种类型的过程。在编程中,类型转换是一项重要操作,因为不同的数据类型有各自的特点和用途。很多时候,类型本身,即直观地告诉了我们该类型的对象所应当具有的行为以及所能够支持的操作。

鸭子类型的理念,让我们可以跳脱出类型的束缚,但是行为本身毕竟是个动态、隐性的概念,依赖行为,而非显式类型,有时会使得程序变得不那么直观。

类型转换可以帮助我们在这些不同的数据类型之间进行灵活的准换,以在形式上满足编程的灵活性要求,又不至于降低代码的可读性。

类型转换一般分为两种类型:

1、显式转换(Explicit Conversion):也称为类型显式转换,是指通过使用特定的函数或者方法将一种数据类型转换为另一种数据类型。在Python中,常见的显示转换函数有:int()、float()、str()、list()、tuple()等,需要说明的是,在实现中,这些函数可能又是对应的类的构造或者初始化函数的形式呈现。

2、隐式转换(Implicit Conversion):也称为类型隐式转换,是由Python解释器自动完成的类型转换。这种转换通常发生在混合类型的表达式中。Python会自动完成一些类型转换以确保运算的正确性。

两种类型转换的优缺点也是显而易见的,一个是更加直观、可读,另一个是更加简洁。当然,从长期代码维护的角度看,应该更多地采用显式类型转换,这跟我们写注释、写文档是同样的目的。

内置类型的类型转换

Python中提供了丰富的内置类型转换函数,这些函数在调用时会尝试调用对象相应的魔术方法来进行类型转换。

简单列举一下常见的类型转换函数及对应的魔术方法:

1、int(obj):会尝试调用obj.__int__()方法,将对象转换为整型。

2、float(obj):会尝试调用obj.__float__()方法,将对象转换为浮点型。

3、str(obj):会尝试调用obj.__str__()方法,将对象转换为字符串。

4、bool(obj):会尝试调用obj.__bool__()方法,将对象转化为布尔类型。

5、bytes(obj):会尝试调用obj.__bytes__()方法,将对象转换为字节类型。

自定义类型的类型转换

明白了内置类型的类型转换的逻辑,本质上也是调用对象的对应的魔术方法,那么自定义类型以支持类型转换,也就比较简单了。

接一下,通过代码实例来看下自定义类型的类型转换的实现。

class MyNumber:
    def __init__(self, value):
        try:
            self.value = float(value)
        except:
            print('初始化失败,请检查参数')
            self.value = None

    def __int__(self):
        return int(self.value)

    def __float__(self):
        return float(self.value)

    def __str__(self):
        print('__str__()被调用')
        return str(self.value)

    def __bool__(self):
        print('__bool__()被调用')
        # 仅做演示,否则默认行为为非None,即为True
        return self.value > 10

    def __add__(self, other):
        print('__add__()被调用')
        if isinstance(other, (int, float)):
            return self.__class__(self.value + other)
        elif isinstance(other, str):
            return self.__class__(self.value + float(other))
        elif isinstance(other, self.__class__):
            return self.__class__(self.value + other.value)
        return NotImplemented

    def __radd__(self, other):
        print('__radd__()被调用')
        return self.__add__(other)


if __name__ == '__main__':
    a = MyNumber(0)
    print(a)
    print('=' * 40)
    print('True' if a else 'False')
    print('=' * 40)
    b = a + '-5'
    print('=' * 40)
    print(b)
    c = 20 + b
    print('=' * 40)
    print(c)

执行结果:

b93b86cdd4422c203c0ed63ecc131ef7.jpeg

总结

本文简单介绍了类型转换的内容,首先是类型转换的概念及需求场景,以及显式类型转换和隐式类型转换。然后介绍了Python中内置类型转换的实现机制,以及自定义类型如何实现类型转换。

感谢您的拨冗阅读,希望对您有所帮助。

1a0c8fe3ae57b7c9ebe517f8474da123.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析

作品详情  运用Hadoop和MongoDB对得分能力数据进行分析;  运用python进行机器学习的模型调理,利用Pytorch框架对爬取的评论进行情感分析预测;  利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。

Chainlit集成LlamaIndex实现知识库高级检索(组合对象检索)

检索原理 对象组合索引的原理 是利用IndexNode索引节点,将两个不同类型的检索器作为节点对象,使用 SummaryIndex (它可以用来构建一个包含多个索引节点的索引结构。这种索引通常用于从多个不同的数据源或索引方法中汇总信息,并能…

零工市场小程序如何提高找兼职的效率?

越来越多的人们会选择成为自由职业者,或者在空暇时兼职来获取酬劳,那么传统的找兼职方式,如:中介公司、招聘广告等。 如今大家的生活都已经进入了“快节奏”,零工市场小程序针对这样的问题而提出了解决方案&#xff0…

python Scrapy 框架 demo

文章目录 前言python Scrapy 框架 demo1. 安装2. 百度热搜爬取demo2.1. 初始化项目2.2. 修改 items.pyitems.py2.3. 创建 spiders/baidu_spider.py2.4. 修改 pipelines.py2.5. 修改 settings.py 3. settings.py 相关配置说明4. 启动爬虫测试 前言 如果您觉得有用的话&#xff0…

python+requests接口测试

pythonrequest 一、调用的方法 requests是一个第三方库 (1) a、下载地方库pip install requests b、pycaharm中下载 (2)导入requests库 (3)requests中的三种调用方法 第一种: requests.…

算法训练营打卡Day18

目录 二叉搜索树的最小绝对差二叉搜索树中的众数二叉树的最近公共祖先额外练手题目 题目1、二叉搜索树的最小绝对差 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例: 思…

时间复杂度及空间复杂度(简略)

目录 时间复杂度空间复杂度 时间复杂度 计算时间复杂度时,我们只需计算大致执行次数,再用大O的渐进表示法就可以了 常见的复杂度为O(N),O(1),O(N^2)的几个情况这里就不提了,下面是几个相对来说需要分析的算法 算法1: // 计算str…

【Python报错已解决】TypeError: ‘int‘ object is not subscriptable

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

如何在实际开发中深入使用 yalantinglibs 编译期反射库

yaLanTingLibs 是阿里云开源的现代 C 基础工具库的集合,包括序列化、http、rpc、协程、编译期反射、metric 和日志等库,可以帮助 C 开发者快速构建高性能的 C 应用。2024 云栖大会操作系统技术 Workshop 上,阿里云智能集团高级技术专家、pure…

快手:数据库升级实践,实现PB级数据的高效管理|OceanBase案例

本文作者:胡玉龙,快手技术专家 快手在较初期采用了OceanBase 3.1版本成功替换了多个核心业务、数百套的MySQL集群。至2023年,快手的数据量已突破800TB大关,其中最大集群的数据量更是达到了数百TB级别。为此,快手将数据…

Docker安装consul + go使用consul + consul知识

1. 什么是服务注册和发现 假如这个产品已经在线上运行,有一天运营想搞一场促销活动,那么我们相对应的【用户服务】可能就要新开启三个微服务实例来支撑这场促销活动。而与此同时,作为苦逼程序员的你就只有手动去 API gateway 中添加新增的这…

基于AI的智能化渗透测试技术研究

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

问题:vscode 打印中文时终端输出乱码

文章目录 问题分析解决 问题 在 vscode 编辑器中的终端运行出来的中文是乱码 分析 乱码原因:因windows中文版系统cmd编码默认为GBK,而vscode默认新建文件的编码为UTF-8所以会出现中文乱码情况 解决 终端下输入 chcp 查看当前的cmd编码设置。如图&…

在windows下编译 chromium 的问题汇总(103.0.5060.68 之四)

其实,按照chromium 官方文档来看,大概率是不会出错的,但由于各自的系统差异化,当中遇到的坑也是各不相同。 尤其是在国内的网络情况下,出错是再所难免的,关于这一点,chromium官方文档是没有提及…

哈希-01-数据分类处理

文章目录 1. 题目描述2. 思路3. 代码 1. 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据…

基于SSM+Vue+MySQL的在线视频学习系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展,在线视频学习已成为人们获取知识、提升技能的重要途径。然而,传统的视频学习平台往往存在内容管理不便、用户体验不佳等问题。因此,开发一款基于SSM(SpringS…

12、echarts 没有显示折线图

一、问题描述 echarts 没有显示折线图,但是,有数据显示: 看图表展示,y轴数据全部没有显示,直接可以判定是数据结构出问题了。 检查 series.data[] 数据结构: dataList [{"dateStr":"202…

06.C/C++内存管理

在这里C的内存管理相较于C作出了许多升级,下面我们就来了解一下。 1.C/C内存分布 我们先来看一下下面的问题,温习一下C的内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1…

Web安全 - 跨站点请求伪造CSRF(Cross Site Request Forgery)

文章目录 OWASP 2023 TOP 10CSRF 导图CSRF的基本概念CSRF的工作原理常见CSRF攻击模式CSRF防御策略补充建议应用场景实战防御策略选择1. CSRF Token(首选)2. SameSite Cookie属性3. 验证Referer和Origin4. 多因素认证 实现方案CSRF Token实现SameSite Coo…

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)

目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框:在保留当前页面状态的情况下,告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框,并…