魔法方法
__init__ :初始化类时触发
__del__ :删除类时触发
__new__ :构造类时触发
__str__ :str函数或者print函数触发
__repr__ :repr或者交互式解释器触发
__doc__ :打印类内的注释内容
__enter__ :打开文档触发
__exit__ :关闭文档触发
__getattr__ : 访问不存在的属性时调用
__setattr__ :设置实例对象的一个新的属性时调用
__delattr__ :删除一个实例对象的属性时调用
__setitem__ :列表添加值
__getitem__ :将对象当作list使用
__delitem__ :列表删除值
__call__ :对象后面加括号,触发执行
(1)__init__
__init__(self, ...)
: 初始化方法,创建对象时自动调用。
class MyClass:
def __init__(self, name):
self.name = name
obj = MyClass(name='heart')
print(obj.name) # heart
(2)__del__
class MyClass:
def __del__(self):
print("对象正在被删除")
obj = MyClass()
del obj # 这会触发 __del__
# 输出:对象正在被删除
(3)__new__
__new__(cls, ...)
: 构造类时触发,在 __init__
之前调用。
class MyClass:
def __new__(cls, *args, **kwargs):
print("正在创建实例")
return super().__new__(cls)
obj = MyClass() # 正在创建实例
(4)__str__
__str__(self)
: str 函数或者 print 函数触发。
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return f"带有值 {self.name} 的 MyClass 实例"
obj = MyClass(name='heart')
print(obj) # 输出:带有值 10 的 MyClass 实例
(5)__repr__
__repr__(self)
: repr 或者交互式解释器触发。
class MyClass:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"MyClass({self.name})"
obj = MyClass(name='heart')
print(repr(obj)) # 输出:MyClass(heart)
(6)__doc__
class MyClass:
"""这是一个示例类"""
def __init__(self, name):
self.name = name
print(MyClass.__doc__) # 输出:这是一个示例类
(7)__enter__
__enter__(self)
: 打开文档触发,通常与 with
语句一起使用。
class MyContext:
def __enter__(self):
print("打开文档")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("关闭文档")
with MyContext() as context:
# 在这里执行一些操作
pass # 这将触发 __exit__
(8)__exit__
__exit__(self, exc_type, exc_value, traceback)
: 关闭文档触发,通常与 with
语句一起使用。
class MyContext:
def __enter__(self):
print("打开文档")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("关闭文档")
with MyContext() as context:
# 在这里执行一些操作
pass # 这将触发 __exit__
(9)__getattr__
__getattr__(self, name)
: 访问不存在的属性时调用。
class MyClass:
def __getattr__(self, name):
return f"属性 {name} 不存在"
obj = MyClass()
print(obj.age) # 输出:属性 age 不存在
(10)__setattr__
__setattr__(self, name, value)
: 设置实例对象的一个新的属性时调用。
class MyClass:
def __setattr__(self, name, value):
print(f"设置属性 {name} 为 {value}")
obj = MyClass()
obj.age = 18 # 输出:设置属性 age 为 18
(11)__delattr__
__delattr__(self, name)
: 删除一个实例对象的属性时调用。
class MyClass:
def __init__(self):
self.age = 19
def __delattr__(self, name):
print(f"删除属性 {name}")
obj = MyClass()
del obj.age # 输出:删除属性 age
(12)__setitem__
__setitem__(self, key, value)
: 列表添加值。
class MyList:
def __init__(self):
self.items = []
def __setitem__(self, key, value):
print(f"在索引 {key} 处设置值 {value}")
self.items[key] = value
my_list = MyList()
my_list[0] = 10 # 输出:在索引 0 处设置值 10
(13)__getitem__
__getitem__(self, key)
: 将对象当作 list 使用。
class MyList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
my_list = MyList([1, 2, 3, 4])
print(my_list[2]) # 输出:3
(14)__delitem__
__delitem__(self, key)
: 列表删除值。
class MyList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
print(f"删除索引 {index} 的值")
del self.items[index]
my_list = MyList([1, 2, 3, 4])
del my_list[1] # 输出:删除索引 1 的值
(14)__call__
__call__(self, ...)
: 对象后面加括号,触发执行。
class MyCallable:
def __call__(self, x, y):
return x + y
add_func = MyCallable()
result = add_func(x=10, y=20)
print(result) # 输出:30