python之魔术方法1:call、len、str、repr

liftword3周前 (01-16)技术文章4

__call__方法

说明

让一个对象的实例变成可执行的。

案例

class Cat:
    '''猫类'''

    def __init__(self, name):
        self.name = name
        self.count = 0

    def eat(self):
        print(f'{self.name}正在进食!')

    def __call__(self, *args, **kwds) -> int:
        for i in args:
            self.count += 1
            print(f'{self.name}抓到了{i},已抓到了{self.count}只猎物')
        return self.count


white_cat = Cat('大白猫')
white_cat('麻雀', '老鼠')

out:
大白猫抓到了麻雀,已抓到了1只猎物
大白猫抓到了老鼠,已抓到了2只猎物

white_cat(‘麻雀’, ‘老鼠’)效果完全等价于white_cat.__call__(‘麻雀’, ‘老鼠’)。实际上就是解释器做了个约定:实例后面()时实际就是调用该实例的__call__方法。

假如你定义的类的绑定方法只有一个(或某个方法使用频率非常高),那么可以把那个方法名写成__call__,这样后续使用时会方便很多,可以直接用实例名()来执行。

__len__方法

说明

对实例执行len()时实际就是调用它的__len__方法。

案例

class Cat:
    '''猫类'''

    def __init__(self, name):
        self.name = name
        self.preys = []

    def __len__(self):
        return len(self.preys)

    def eat(self):
        print(f'{self.name}正在进食!')

    def __call__(self, *args, **kwargs):
        self.preys.extend(args)
        for i in args:
            print(f'{self.name}抓到了{i}')
        print(f'{self.name}抓到了{len(self)}只猎物!')


white_cat = Cat('大白猫')
white_cat('小麻雀', '小老鼠')
white_cat('大麻雀', '大老鼠')
white_cat('小猫鱼', '大青鱼')

out:
大白猫抓到了小麻雀
大白猫抓到了小老鼠
大白猫抓到了2只猎物!
大白猫抓到了大麻雀
大白猫抓到了大老鼠
大白猫抓到了4只猎物!
大白猫抓到了小猫鱼
大白猫抓到了大青鱼
大白猫抓到了6只猎物!

在这个案例中对之前的代码做了优化,现在的大白猫还能记住它抓到的所有猎物,当你len(white_cat)就可以知道大白猫抓到了几只猎物。

对一个实例使用len()时,实际上就是在调用这个实例的__len__方法。

__str__方法和__repr__方法

说明

可以自定义打印实例时字符串的内容。

案例

class Cat:
    '''猫类'''

    def __init__(self, name):
        self.name = name
        self.preys = []

    def __len__(self):
        return len(self.preys)

    def eat(self):
        print(f'{self.name}正在进食!')

    def __call__(self, *args, **kwargs):
        self.preys.extend(args)
        for i in args:
            print(f'{self.name}抓到了{i}')
        print(f'{self.name}抓到了{len(self)}只猎物!')

    def __repr__(self):
        return f'啊,{self.name}抓住了“{",".join(self.preys)}”这些猎物。'

    def __str__(self):
        return f'哇,{self.name}抓住了“{",".join(self.preys)}”这些猎物。'


white_cat = Cat('大白猫')
white_cat('小麻雀', '小老鼠')
white_cat('大麻雀', '大老鼠')
white_cat('小猫鱼', '大青鱼')
print(white_cat)

out:
大白猫抓到了小麻雀
大白猫抓到了小老鼠
大白猫抓到了2只猎物!
大白猫抓到了大麻雀
大白猫抓到了大老鼠
大白猫抓到了4只猎物!
大白猫抓到了小猫鱼
大白猫抓到了大青鱼
大白猫抓到了6只猎物!
哇,大白猫抓住了“小麻雀,小老鼠,大麻雀,大老鼠,小猫鱼,大青鱼”这些猎物。

打印实例时会先调用__str__方法,没有__str__方法时会调用__repr__方法,两者都没有时打印的是类似这样的:“<main.Cat object at 0x00000299EE6C45E0>”。

__str__方法和__repr__方法的区别

  • print()时会先调用__str__方法,没有__str__方法时才调用__repr__方法。
  • 在交互模式下直接输入实例回车时显示的是__repr__方法返回的内容。

str函数和repr函数的区别

当参数是字符串数据类型时它们返回的内容不完全一致,其他的数据类型返回的内容完全一致。

test1 = 123
ret1 = str(test1)
ret2 = repr(test1)
print(ret1, ret2, ret1 == ret2)

test1 = '123'
ret1 = str(test1)
ret2 = repr(test1)
print(ret1, ret2, ret1 == ret2)

out:
123 123 True
123 '123' False

注意:对字符串数据进行repr后得到的内容会多一对单引号,长度会加2;对字符串数据进行str后得到的内容和原来一样。

相关文章

第20p,什么是字符串?Python中的str

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第20篇文章,第二阶段的课程:Python基础知识:Python的字符串(上篇)学习本课程,建议先看一遍:【计算机基础知识】课程。 一、什么是字...

每天3分钟Python基础-str字符串

Python是一门强大的编程语言,广泛应用于各种领域。字符串是Python中非常重要的一种数据类型,也是编程中最常用的数据类型之一。字符串是由字符序列组成的不可变序列,Python提供了许多有用的字符...

Python 中的 byte和str有什么区别?

在 Python 中,byte和str是两种不同的数据类型,用于表示不同形式的数据。字节(byte):字节是用于表示二进制数据的一种数据类型。它的主要用途是处理网络数据或读取/写入二进制文件。字节串是...

python __str__、__repr__和__bytes__功能及应用示例

在Python中,__str__、__repr__和__bytes__是三个特殊的方法,用于定义对象的字符串表示形式。它们分别用于可读性的字符串表示、准确无歧义的字符串表示和二进制表示。下面是它们的功...

「Python教程」第6篇 Python基本语法之字符串

从本篇开始,我们开始学习Python的基本语法。由于字符串是在程序中最常用到的数据类型,那么就先从字符串开始。目录如何表示字符串多行字符串转义字符禁止转义格式化字符串关联文章列表如何表示字符串在Pyt...