函数 #
__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 表达式的一个糖
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。