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

引言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南宫理的日知录

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

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

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

打赏作者

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

抵扣说明:

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

余额充值