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

__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后得到的内容和原来一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值