__init__、__len__、__getitem__及其他常用魔法方法

在Python中,魔法方法(Magic Methods)是一些特殊的内置方法,它们通常以双下划线(__)开头和结尾,通常用于实现对象的行为和交互。它们不仅能让你在自定义类中定义对象的基本操作,还能控制运算符、上下文管理等。如__init____len____getitem__等,我们该如何理解并应用这些方法?文末附有常用的几种方法表格。

什么是魔法方法?

魔法方法是Python中的一类特殊方法,它们是内置的,可以让开发者在自定义类时重载Python的运算符或改变对象的行为。魔法方法也被称为“特殊方法”或“dunder方法”(因为它们的名字通常由两个下划线包围)。

这些方法允许你定义和控制常见的对象行为,例如初始化、索引、运算符重载等。通过实现这些方法,你可以使你的类对象更加灵活和强大。通过这种方式,我们可以让自定义类像内建类型一样,具有与标准Python类型相同的行为。如果没有定义相关的魔法方法,Python 会无法识别你想要执行的操作,也就是说无法在外部使用该功能。例如,如果你没有为你的自定义类实现 getitem 方法,那么就不能使用索引操作(例如 dataset[index])来访问数据集的元素。


常见的魔法方法介绍

1. __init__:初始化方法
  • 这是类的构造函数,用于初始化对象。当你创建一个新的对象时,__init__ 方法会自动被调用。

  • 语法:

    class MyClass:
        def __init__(self, param):
            self.param = param
    
  • 示例:

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    p1 = Person("Alice", 30)
    print(p1.name)  # 输出 Alice
    print(p1.age)   # 输出 30
    
2. __len__:返回对象长度
  • __len__ 方法用于返回对象的长度,在Python中调用 len() 时会自动调用此方法。

  • 语法:

    class MyClass:
        def __len__(self):
            return len(self.some_list)
    
  • 示例:

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __len__(self):
            return len(self.items)
    
    lst = MyList([1, 2, 3, 4])
    print(len(lst))  # 输出 4
    
3. __getitem__:获取对象的元素
  • __getitem__ 方法让对象支持索引操作(如 []),并返回相应位置的元素。

  • 语法:

    class MyClass:
        def __getitem__(self, index):
            return self.items[index]
    
  • 示例:

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __getitem__(self, index):
            return self.items[index]
    
    lst = MyList([10, 20, 30])
    print(lst[0])  # 输出 10
    print(lst[1])  # 输出 20
    
4. __setitem__:设置对象的元素
  • __setitem__ 方法允许我们使用索引操作符([])来设置对象中的元素。
  • 示例:
    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __setitem__(self, index, value):
            self.items[index] = value
    
    lst = MyList([1, 2, 3])
    lst[0] = 10
    print(lst.items)  # 输出 [10, 2, 3]
    
5. __delitem__:删除对象的元素
  • __delitem__ 方法使得我们可以通过 del 语句删除对象中的元素。
  • 示例:
    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __delitem__(self, index):
            del self.items[index]
    
    lst = MyList([10, 20, 30])
    del lst[0]
    print(lst.items)  # 输出 [20, 30]
    
6. __iter__:实现迭代器
  • __iter__ 方法使得对象支持迭代功能,即可以在 for 循环中遍历。
  • 示例:
    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __iter__(self):
            return iter(self.items)
    
    lst = MyList([1, 2, 3])
    for item in lst:
        print(item)
    # 输出:
    # 1
    # 2
    # 3
    
7. __call__:使对象可调用
  • __call__ 方法允许你将对象当作函数来调用。
  • 示例:
    class Adder:
        def __init__(self, start=0):
            self.value = start
    
        def __call__(self, num):
            self.value += num
            return self.value
    
    adder = Adder(10)
    print(adder(5))  # 输出 15
    
8. __str__:字符串表示
  • __str__ 方法用于定义对象的字符串表示。当你使用 print()str() 时,Python 会调用该方法。
  • 示例:
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return f"Person(name={self.name}, age={self.age})"
    
    p1 = Person("Alice", 30)
    print(p1)  # 输出 Person(name=Alice, age=30)
    
9. __repr__:官方字符串表示
  • __repr__ 方法定义了对象的官方字符串表示,通常用于调试时显示对象。若未定义此方法,Python 会默认使用 __str__
  • 示例:
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __repr__(self):
            return f"Person('{self.name}', {self.age})"
    
    p1 = Person("Bob", 25)
    print(repr(p1))  # 输出 Person('Bob', 25)
    
10. __add__:加法运算符重载
  • __add__ 方法定义了 + 运算符的行为。
  • 示例:
    class Vector:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __add__(self, other):
            return Vector(self.x + other.x, self.y + other.y)
    
    v1 = Vector(1, 2)
    v2 = Vector(3, 4)
    v3 = v1 + v2
    print(v3.x, v3.y)  # 输出 4 6
    

常用魔法方法汇总表

魔法方法作用示例
__init__初始化对象obj = ClassName(param)
__len__返回对象长度len(obj)
__getitem__获取指定索引的元素obj[index]
__setitem__设置指定索引的元素obj[index] = value
__delitem__删除指定索引的元素del obj[index]
__iter__定义对象的迭代行为for item in obj:
__call__使对象可调用obj()
__str__定义对象的字符串表示print(obj)
__repr__定义对象的官方字符串表示repr(obj)
__add__重载加法运算符obj1 + obj2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值