目录
引言
🌟 实例一:__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 = nameself.age = age
person = Person("张三", 30)
print(person.name) # 输出:张三
🌟 实例二:__str__和__repr__方法
这两个方法用于返回对象的字符串表示,__str__通常更面向用户,而__repr__则用于调试。
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __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 = xself.y = ydef __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 = itemsdef __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 = itemsdef __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 = maxself.current = 0def __iter__(self):return selfdef __next__(self):if self.current >= self.max:raise StopIterationelse:self.current += 1return 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 = filenamedef __enter__(self):self.file = open(self.filename, 'r')return self.filedef __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 = Nonedef __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的精髓之一。希望今天的分享能帮助你更好地理解并应用这些魔法方法!
如果你有任何问题或想了解更多细节,欢迎留言或私信!记得订阅我们的微信订阅号,以便及时收到更多有用的编程技巧和文章更新。🚀