Flask—偏函数

一、偏函数

1. 定义

        实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值。而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数预先赋值,以便函数能用更少的参数进行调用。

2. 例子

def my_sum(*args):
    result = 0
    for i in args:
        result += i
    return result

my_sum(1,2,3,4)

        从上面的代码可知,此代码的功能就是实现一个求和功能,实例中是求取1,2,3,4四个数的和,但是当我们需要在这个结果上再加上7,8,9 甚至更多的数字或者求万又有更多的需求,应该怎么办呢,如下:

my_sum(1,2,3,4)+my_sum(7,8,9)

        注意到,每次有新需求时,都需要再次调用my_sum函数,这样很费力,参数多了之后更麻烦,而偏函数便可解决这类问题,因此偏函数可总结为:当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

3. 偏函数说明

  • import:from functools import partial
  • 第一个参数:自定义函数或者是python内置函数
  • 第二个参数:可变参数,如果没有指定关键字,按原有函数的参数顺序进行补充,参数将作 用在原函数上,如果指定关键字就对应到所指位置

二、偏函数的实例

1. 基础版

def add(a, b):
    return a + b


if __name__ == "__main__":
    # 重新生成一个偏函数对象(其中一个参数已知),并赋予mysum,然后再调用这个新函
    # 数对象,10为预先设定的参数
    mysum = partial(add, 10)
    print mysum(5)

# 结果
15

2. 关键字参数版

def add(a, b=2):
    return a + b


def add2(a=2, b=3):
    return a + b


if __name__ == "__main__":
    mysum = partial(add, 10)
    print mysum()

    # 也可根据关键字预先设定的参数值
    mysum2 = partial(add, b=3)
    print mysum2(1)

    # 如果没有关键字,按原有参数顺序补充
    mysum3 = partial(add2, 1)
    print mysum3()

# 结果
12
4
4

3. 升级版

class User(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age


def get_user_info(user, property_name):
    value = eval('user.' + property_name)
    return value


if __name__ == "__main__":
    user = User('xiaoming', 20)
    func = partial(get_user_info, property_name='age')
    print func(user)

# 结果
20

参考博客:偏函数

三、面向对象补充知识

1、__call__
和__init__相对应。__call__是对象()自动运行该方法。
__init__: 类()
__call__:   对象()

class Foo:
    def __call__(self):
        print('1')

obj = Foo()
obj()
obj1 =Foo()()  # 也可以写成这种形式

2、__setattr__/__getattr__
__getattr__:拦截对象的点号运算
当对为定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果
继承树可以找到该属性,则不调用此方法
class empty:
    def __getattr__(self,attrname):
        if attrname == 'age':
            return 40
        else:
            return AttributeError,attrname

# `__getattr__`只有在使用点调用属性且属性不存在的时候才会触发
x = empyte()
print(x.age) #40
print(x.name)  #报错

__setattr__:拦截所有属性的赋值语句

3、__getitem__/__setitem__
__xxxitem__:使用 [''] 的方式操作属性时被调用
__setitem__:每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环
__getitem__:当访问不存在的属性时会调用该方法
__delitem__:当删除属性时调用该方法

 

你可能感兴趣的:(Flask框架)