Python魔法方法使用详解及__getitem__、__len__使用举例

本文介绍了Python中的魔法方法,包括它们的定义、如何被解释器调用以及如何通过重写魔法方法来扩展对象的行为。通过具体实例展示了__len__和__getitem__方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是魔法方法

        Python中魔法方法以__(双下划线)开头,以__(双下划线)结尾,当python解释器碰到特殊句法时会使用魔法方法去进行一些基本的对象操作。例如对一个可索引对象obj,进行obj[key]时,解释器会调用obj.__ getitem__(key)方法。
        魔法方法又叫特殊方法/双下方法。

2.魔法方法的使用

        例:当我们使用len

        明确一点:魔法方法的存在是为了给解释器调用,对于我们而言,不存在obj.__ len__()这种写法,应使用len(obj)。

        如果obj是我们自定义的类对象,且我们给这个类重写了__len__方法,那么当进行len(obj)时,python会自动调用我们重写的__len__方法

        如果obj是内置类型对象,如list、str、bytearry等,执行len(obj)时,调用内置的__ len__方法会直接返回PyVarObject内的ob_size属性

3.以__getitem__、__len__方法举例使用魔法方法

自定义一个类,类中重写__getitem__、__len__方法

import collections
person=collections.namedtuple('persion',['name','age'])
people = ['bob', 'Alice', 'John']
age_coll = ['13', '17', '42']
class magic(object):
    def __init__(self):
        self._person=[person(name,age) for name in people for age  in age_coll]

    def __len__(self):
        return len(self._person)
    def __getitem__(self, item):
        return self._person[item]
mag=magic()
print(len(mag))
print(mag[2])
#控制台输出:
#9
#persion(name='bob', age='42')

注意一点

当我们对魔法方法进行重写时,按理说我们实现的功能应当还是原方法的功能,但此时解释器只听我们的(调用我们写的重写的魔法方法)

那么,我们是可以搞破坏的:
将上述__getitem__写成这样:

    def __getitem__(self, item):
        return 'i am sabotaging'

执行

print(mag[2])
print(mag[3])

结果全为 i am sabotaging
当我们对魔法方法重写时,完全可以随意发挥(最好不要这样,玩玩还是可以的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

涛涛ALG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值