1.什么是魔法函数
以__开始和结束,不需要专门调用,在特定场合下,python会自己调用,如__init__, __str__等
2.常用的魔法函数
__str__: 返回类对象友好的提示,例子
class Test:
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
obj = Test(name="Hello, World")
print(obj)
__len__:计算对象容器中元素的个数 # 应用场景???,将类当容器处理
class TestLen:
def __init__(self, mylist):
self.mylist = mylist
def __len__(self):
return len(self.mylist)
obj = TestLen([1,2,3,4])
print(len(obj)) # 去掉__len__, 则报错
__setitem__(新建字典),__getitem__(通过key获取value),__delitem__(删除key对应的value),应用场景,将类当字典处理
class TestDict:
def __init__(self):
self.dict = {}
# 新建字典
def __setitem__(self, key, value):
self.dict[key] = value
# 通过字典key获取value
def __getitem__(self, item):
return self.dict[item]
# 删除对应key的记录
def __delitem__(self, key):
del self.dict[key]
obj = TestDict()
obj.dict["name"] = "hyh" # 调用__setitem__
obj["age"] = 18 # 效果同上
print(obj.dict)
print(obj["name"]) # 调用__getitem__
del obj["age"] # 调用__delitem__
print(obj.dict)
__iter__,__next__:迭代器 ,将类对象当作可迭代对象
class TestIterator:
def __init__(self, value):
self.start = 0
self.end = value
def __iter__(self):
return self
def __next__(self):
if self.start < self.end:
self.start += 1
return self.start
else:
raise StopIteration
obj = TestIterator(5)
# 可遍历
for i in obj:
print(i)
# 使用next函数遍历
#print(next(obj))
#print(next(obj))
__enter__,__exit__:实现with上下文管理
class TestWith:
def __init__(self, filename, mode="r", encoding="utf-8"):
self.filename = filename
self.__file = open(filename, mode, encoding=encoding)
def __enter__(self):
print("enter")
return self
def write(self, content):
print("write")
self.__file.write(content)
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
self.__file.close()
with TestWith(r"E:\python_apps\bk-pipline\haoyong_test\hyh.txt", mode="w", encoding="utf-8") as f:
f.write("nihao\n hello world")
实现数据库连接释放