返回顶部

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函数,在交互模式下直接输入对象名,会出现对象相关的描述信息

 

 

 数学运算魔法函数

 

posted @ 2018-12-04 20:15  Crazymagic  阅读(549)  评论(0编辑  收藏  举报