一文带你深入理解Python魔法方法
作者:小小张说故事
一、构造和初始化
__new__ 和 __init__ 是 Python 对象生命周期的开始。__new__ 方法是在一个对象实例化的时候所调用的第一个方法,在调用 __init__ 初始化前,先调用 __new__。
class MyClass:
def __new__(cls, *args, **kwargs):
print('Instance is created')
instance = super().__new__(cls)
return instance
def __init__(self, name):
print('Instance is initialized')
self.name = name
obj = MyClass('MyClass') # 输出:Instance is created Instance is initialized二、字符串表示
__str__ 和 __repr__ 都是用于显示的魔法方法。__str__ 是友好易读的方式呈现,而 __repr__ 是准确、无歧义地表达出来,主要供开发和调试时使用。
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return f'Instance of MyClass with name {self.name}'
def __repr__(self):
return f'MyClass(name={self.name})'
obj = MyClass('MyClass')
print(str(obj)) # 输出:Instance of MyClass with name MyClass
print(repr(obj)) # 输出:MyClass(name=MyClass)三、算术运算符
魔法方法还可以用来定义对象的算术运算行为,例如 __add__、__sub__、__mul__ 等。
class Number:
def __init__(self, value):
self.value = value
def __add__(self, other):
return self.value + other.value
num1 = Number(1)
num2 = Number(2)
print(num1 + num2) # 输出:3四、比较运算符
比较运算符的魔法方法包括 __lt__、__le__、__eq__、__ne__、__gt__、__ge__ 等。
class Number:
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
num1 = Number(1)
num2 = Number(2)
print(num1 < num2) # 输出:True五、属性访问
当我们试图访问一个对象的属性时,__getattr__、__setattr__、__delattr__ 和 __getattribute__ 魔法方法就会被调用。__getattribute__ 方法是用于获取一个属性的值,而 __setattr__ 是在我们试图设置一个属性值时被调用。
class MyClass:
def __init__(self):
self.name = 'MyClass'
def __getattribute__(self, item):
if item == 'name':
print('Accessing name attribute')
return object.__getattribute__(self, item)
def __setattr__(self, key, value):
print(f'Setting attribute {key} with value {value}')
self.__dict__[key] = value
obj = MyClass()
print(obj.name) # 输出:Accessing name attribute MyClass
obj.name = 'New name' # 输出:Setting attribute name with value New name六、上下文管理器
上下文管理器是通过 __enter__ 和 __exit__ 魔法方法实现的,它们通常在 with 语句中使用。
class ManagedFile:
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):
if self.file:
self.file.close()
with ManagedFile('hello.txt') as f:
content = f.read()
print(content)在这个例子中,__enter__ 方法打开文件并返回,__exit__ 方法在离开 with 块时被调用,负责关闭文件。
七、结论
Python 的魔法方法为我们提供了改变对象行为的强大工具,让我们能够以符合 Python 风格的方式去操作和处理对象。同时,理解并掌握这些魔法方法也是成为高级 Python 程序员的必经之路。
到此这篇关于一文带你深入理解Python魔法方法的文章就介绍到这了,更多相关Python魔法方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
