Python中魔法方法(magic method)其实就是那些被双下划线包围的方法,比如__init__
,__str__
等等。
这些魔法方法为类添加了魔力,让我们可以在面向对象编程中用更加简洁的代码来操作对象。
本文根据面向对象编程的一些场景来介绍常用的魔法方法。
文末领取Python全套最新学习资源
1. 对象构建
为了初始化对象,我们常常在对象中定义一个__init__
方法,比如:
class Student(object):
"""
学生信息
"""
def __init__(self, name):
print("[__init__] Student 初始化...")
self.name = name
# 创建对象
stu = Student("小明")
# 运行结果
[__init__] Student 初始化...
当我们创建对象时,会自动调用魔法方法__init__
去初始化属性。
与__init__
对应的是__del__
,它会在对象失效的调用,
我们可以在__del__
方法中清理对象Student
占用的资源。
class Student(object):
def __init__(self, name):
print("[__init__] 初始化 Student...")
self.name = name
def __del__(self):
print("[__del__] 清理 Student...")
def foo():
print("进入 foo 函数...")
stu = Student("小明")
print("离开 foo 函数...")
foo()
# 运行结果
进入 foo 函数...
[__init__] 初始化 Student...
离开 foo 函数...
[__del__] 清理 Student...
进入 foo
函数后创建对象,离开后,自动清理对象。
2. 对象属性访问
python
的对象是可以直接访问属性的,但是访问不存在的属性时,会抛出异常。
class Student(object):
def __init__(self, name):
print("[__init__] 初始化 Student...")
self.name = name
stu = Student("小明")
print(stu.name)
print(stu.fullname)
# 运行结果
[__init__] 初始化 Student...
小明
AttributeError: 'Student' object has no attribute 'fullname'
如果不想抛出异常,从而影响程序的其他部分的运行,
这里可以用魔法方法 __getattr__
来控制访问了不存在的属性时的行为。
比如,下面的示例中,访问不存在的属性时,返回False
,不抛出异常。
class Student(object):
def __init__(self, name):
print("[__init__] 初始化 Student...")
self.name = name
def __getattr__(self, attr):
print("[__getattr__] 访问了 Student 不存在的属性 {}".format(attr))
return