02 python中魔法函数
什么是魔法函数
简单的说,python中的魔法函数,就是以双下划线开头和双下划线结尾的函数,在类中定义后python解释器会执行。所以我们可以根据自己的场景需要使用不同的魔法函数
一个小实例假如我们想对类进行遍历取值,通常我们的做法可能如下
class Company(object): def __init__(self, employee_list): self.employee = employee_list company = Company(["tom", "bob", "jane"]) for item in company.employee: print(item)
可以通过 __getitem__(self, item)方法可以把一个类编程可迭代对象(序列类型), 其中的 item 根据 python 的序列类型而定(字典,元组)
class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] company = Company(["tom", "bob", "jane"]) company1= company[:2] for item in company1: print(item)
输出结果
python中数据模型对python的影响
在类中我们使用python的数据模型(也就是魔法函数),也就改变了python的语法
如我们在类中定义__getitem__这时候类就变成了一个序列,我们可以对它进行切片操作。在比如我们在类中使用__len__方法的话,我们就可以对它进行求长度
class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] def __len__(self): return len(self.employee) company1 = Company(["tom", "bob", "jane"]) print(company1[:2]) print(len(company1))
输出结果如下
属性拦截器 __getattr__
__getattr__ 如果对象内部定义了一个方法或者属性,就不会调用 __getattr__ 如果没有定义则会调用
class Admin(object): @staticmethod def as_operator(username): return UserManagerOperating().as_operator(username) def __getattr__(self, key): print(type(key)) return getattr(UserManagerOperating(), key) class UserManagerOperating(object): def __init__(self): self.operator = None # default None def as_operator(self, operator): self.operator = operator return self def remove_user(self, pk): print('remove_user ok') return True def as_operatr(self): print(123) if __name__ == '__main__': Admin().as_operator('zhangbiao').remove_user('hi')
输出结果如下
简单的应用场景数据库的操作
class Admin(object): def __getattr__(self, operating): return AdminPoerating(operating) class AdminPoerating(object): def __init__(self, operating): # operating 在这里它只是一个参数而已(str) self.operating = operating def __call__(self, *args, **karg): operatings = DatabaseOperatings() func = getattr(operatings, self.operating) try: return func(*args, **karg) except Exception as e: print(e) class DatabaseOperatings(object): '''manage user data in database''' def add_user(self): print('add_user') def update_user(self): print('update_user') def remove_user(self): print('remove_user') def get_user(self): print('get_user') def is_last_admin(self): print('is_last_admin') if __name__ == '__main__': Admin().remove_user() Admin().get_user()
输出结果如下
结合使用
# -*- coding:utf-8 -*- class Admin(object): @staticmethod def as_operator(username): return UserManagerOperating().as_operator(username) def __getattr__(self, key): return getattr(UserManagerOperating(), key) class UserManagerOperating(object): def __init__(self): self.operator = None # default None self.database = DatabaseManager() def as_operator(self, operator): self.operator = operator return self def add_user(self): self.database.add_user() def remove_user(self): self.database.remove_user() def update_user(self): self.database.update_user() class DatabaseManager(object): def __getattr__(self, operating): return DatabasePoerating(operating) class DatabasePoerating(object): def __init__(self, operating): # operating 在这里它只是一个参数而已(str) self.operating = operating def __call__(self, *args, **karg): operatings = DatabaseOperatings() func = getattr(operatings, self.operating) try: return func(*args, **karg) except Exception as e: raise e class DatabaseOperatings(object): '''manage user data in database''' def add_user(self): print('add_user') def update_user(self): print('update_user') def remove_user(self): print('remove_user') def get_user(self): print('get_user') if __name__ == '__main__': Admin().as_operator('zhang').add_user() Admin().as_operator('zhang').update_user() Admin().as_operator('zhang').remove_user() Admin().remove_user()
python魔法函数一览
python中的魔法函数包括: 数学运算和非数学运算
非数学运算魔法函数
__str__ 和 __repr__的却别
_repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。
__str__ 是在字符串格式化的时候调用,比如print(obj)会调用对象内部的__str__方法
__repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,在交互模式下直接输入对象名,会出现对象相关的描述信息
数学运算魔法函数