函数

函数 #

__init__ vs __new__ #

__new__ 最先被调用,通常用于控制生成一个新实例的过程。 它是类级别的方法。

__new__ 方法主要是当你继承一些不可变的 class 时 (比如 int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的 metaclass。

__init__ 方法通常用在初始化一个类实例的时候调用。

class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))

i = PositiveInteger(-3)
print i # -3

# 对于 int 这种 不可变的对象,我们只有重载它的 __new__ 方法才能起到自定义的作用
class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))

i = PositiveInteger(-3)
print i # 3

__new__ 来实现单例 #

class Singleton(object):
    def __new__(cls):
        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

obj1 = Singleton()
obj2 = Singleton()

obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1 # value1 value1
print obj1 is obj2 # True

metaclass vs __new__ #


Partial function 偏函数 #

functools.partial 的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数

当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

柯里化 Currying #

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数 (最初函数的第一个参数) 的函数,并且返回接受余下的参数且返回结果的新函数

柯里化(Currying)是由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

从纯粹的语义上,curry 化就是 lambda 表达式的一个糖

参考:


本文访问量

本站总访问量

本站总访客数