Python 魔法方法小结

目录

引言

🌟 实例一:__init__构造方法

🌟 实例二:__str__和__repr__方法

🌟 实例三:__add__运算符重载

🌟 实例四:__len__方法

🌟 实例五:__getitem__和__setitem__索引操作

🌟 实例六:__iter__和__next__迭代器协议

🌟 实例七:__call__方法

🌟 实例八:__enter__和__exit__上下文管理器

🌟 实例九:__getattr__和__setattr__动态属性

🌟 实例十:__new__和单例模式



引言

在Python中,魔法方法是一些特别的成员函数,它们被用于实现Python的特殊语法。这些方法的名称由双下划线包围,例如__init__、__str__、__add__等。今天,我们将一起探索10个最常用的魔法方法,并通过实例代码来理解它们是如何工作的。

🌟 实例一:__init__构造方法

当我们创建一个类的实例时,__init__方法会被自动调用,用于初始化对象的状态。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
person = Person("张三", 30)
print(person.name)  # 输出:张三

🌟 实例二:__str__和__repr__方法

这两个方法用于返回对象的字符串表示,__str__通常更面向用户,而__repr__则用于调试。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"{self.name} ({self.age}岁)"
    def __repr__(self):
        return f"Person('{self.name}', {self.age})"
person = Person("李四", 25)
print(str(person))  # 输出:李四 (25岁)
print(repr(person)) # 输出:Person('李四', 25)
 

🌟 实例三:__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

🌟 实例四:__len__方法

当使用len()函数时,如果对象定义了__len__方法,那么它会被调用来计算对象的长度。​​​​​​​

class MyList:
    def __init__(self, items):
        self.items = items
    def __len__(self):
        return len(self.items)
my_list = MyList([1, 2, 3])
print(len(my_list))  # 输出:3

🌟 实例五:__getitem__和__setitem__索引操作

这两个方法允许我们自定义类的索引行为。​​​​​​​

class MyList:
    def __init__(self, items):
        self.items = items
    def __getitem__(self, index):
        return self.items[index]
    def __setitem__(self, index, value):
        self.items[index] = value
my_list = MyList([1, 2, 3])
print(my_list[0])  # 输出:1
my_list[0] = 10
print(my_list[0])  # 输出:10
 

🌟 实例六:__iter__和__next__迭代器协议

定义一个对象如何被迭代。​​​​​​​

class Counter:
    def __init__(self, max):
        self.max = max
        self.current = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.current >= self.max:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1
for i in Counter(5):
    print(i)  # 输出:0, 1, 2, 3, 4

🌟 实例七:__call__方法

__call__使一个对象像函数一样被调用。​​​​​​​

class Callable:
    def __call__(self, x):
        return x * 2
func = Callable()
print(func(5))  # 输出:10
 

🌟 实例八:__enter__和__exit__上下文管理器

这些方法用于实现with语句中的上下文管理器。​​​​​​​

class MyFile:
    def __init__(self, filename):
        self.filename = filename
    def __enter__(self):
        self.file = open(self.filename, 'r')
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
with MyFile('example.txt') as file:
    content = file.read()
    print(content)
 

🌟 实例九:__getattr__和__setattr__动态属性

当尝试访问不存在的属性时,__getattr__会被调用;__setattr__则在设置属性时被调用。​​​​​​​

class Dynamic:
    def __getattr__(self, name):
        return f"动态获取属性 {name}"
    def __setattr__(self, name, value):
        print(f"设置属性 {name} 为 {value}")
        super().__setattr__(name, value)
dynamic = Dynamic()
print(dynamic.some_attribute)  # 输出:动态获取属性 some_attribute
dynamic.some_attribute = "新的值"

🌟 实例十:__new__和单例模式

__new__在创建对象前被调用,可以用来实现单例模式。​​​​​​​

class Singleton:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出:True
 

这些魔法方法使Python的类和对象变得更加强大和灵活。掌握它们,你就掌握了Python的精髓之一。希望今天的分享能帮助你更好地理解并应用这些魔法方法!

如果你有任何问题或想了解更多细节,欢迎留言或私信!记得订阅我们的微信订阅号,以便及时收到更多有用的编程技巧和文章更新。🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

图灵学者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值