目录
🌟 实例五:__getitem__和__setitem__索引操作
🌟 实例八:__enter__和__exit__上下文管理器
🌟 实例九:__getattr__和__setattr__动态属性
引言
在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的精髓之一。希望今天的分享能帮助你更好地理解并应用这些魔法方法!
如果你有任何问题或想了解更多细节,欢迎留言或私信!记得订阅我们的微信订阅号,以便及时收到更多有用的编程技巧和文章更新。🚀