python命名空间&闭包&上下文管理器&鸭子类型

函数与命名空间

函数的全局命名空间始终是定义该函数的模块,而不是调用该函数的命名空间。

函数及其全局命名空间决定了函数中引用全局变量的值

因此,在函数中引用的全局变量始终是定义该函数模块中的全局变量

闭包及其应用(嵌套函数)

闭包:将组成函数的语句和这些语句的执行环境打包到一起所得到的对象。当使用嵌套函数时,闭包将捕获内部函数执行所需的整个环境。

嵌套的函数可以使用被嵌套函数中的任何变量,就像普通函数可以引用全局变量一样,而不需要通过参数引入。

闭包的应用是根据嵌套函数持有定义环境变量的特性来完成功能的

闭包:

def foo():

    x=3

    def bar():

        print('x is %d'%x)

    bar()

闭包与延迟求值:闭包可以实现先将参数传递给一个函数,而并不立即运行,以达到延迟求值的目的。

所谓延迟求值,就是函数返回的是一个函数,而真正需要运行函数中的代码时,其本质还是函数调用。

例:

def delay_fun(x,y):

    def calculator():

        return x+y

    return calculator

if __name__=='__main__':

    print('返回一个求和的函数,并不求和。')

    msum=delay_fun(3,4)

    print()

    print('调用并求和:')

    print(msum())

闭包与泛型函数

例:实现所有类型的一次函数的求值

def line(a,b):

    def aline(x):

        return a*x+b

    return aline

if __name__=='__main__':

    line23=line(2,3)

    line50=line(5,0)

    print(line23(4))

    print(line50(2))

上下文管理器:实现上下文管理协议方法的对象,方便资源管理的一种语法形式。

上下文协议方法:

__enter__(self)          #该方法是进入上下文时调用的,它创建并返回一个可以引用的资源对象,供with语句块中的程序使用

__exit__(self,type,value,tb)   #该方法是推出上下文时调用的,主要用来安全地释放资源对象。参数type、value、tb用于跟踪退出错误时发生的错误类型、值和跟踪信息。

使用上下文管理器的with语句的形式为:

    with context as var:

        pass

变量var将取得上下文管理器的__enter__()方法所返回的资源引用,供with后的代码块中使用

例:

class FileMgr:

    def __init__(self,filename):

        self.filename=filename

        self.f=None

    def __enter__(self):

        self.f=open(self.filename,encoding='utf-8')

        return self.f

    def __exit__(self,t,v,tb):

        if self.f:

            self.f.close()

if __name__=='__main__':

    with FileMgr('10-4.py') as f:

        for line in f.readlines():

            print(lines,end='')

使用这个管理文件的上下文管理器后,在每次使用文件资源时都不用写打开关闭文件的代码,就像操作一般变量一样操作就行了。

contextmanager——将生成器转变为上下文管理器的装饰器

例: 

import contextlib   #内置的上下文管理器的模块

@contextlib.contextmanager

def my_mgr(s,e):

   print(s)

   yield s+' '+e

   print(e)

if __name__=='__main__':

   with my_mgr('start','end') as val:

       print(val)

重写类的特殊方法:

__init__  构造函数,生成对象时调用

__del__ 析构函数,释放对象时调用

__add__ 加运算

__mul__ 乘运算

__cmp__ 比较

__repr__  打印,转换

__setitem__  按照索引赋值

__getitem__   按照索引获取值

__len__       获得长度

__call__      函数调用

鸭子类型与多态:

鸭子类型(duck typing)是动态类型的一种风格,在这种风格中,一个对象有效的语义不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定

“当看到一只鸟走起来像鸭子、游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

在鸭子类型的语言中,编写一个函数可以接受一个任意类型的对象,并调用它的走和叫的方法。任何拥有这样的正确的走和叫方法的对象都可被函数接受。

例:

class Duck:

    def __init__(self,name='duck'):

        self.name=name

    def quack(self):

        print("gagaga....")

class Cat:

    def __init__(self,name='cat')

        self.name=name

    def quack(self):

        print("miaomiaomiao....")

class Tree:

    def __init__(self,name='tree')

        self.name=name

def duck_demo(obj):

    obj.quack()

if __name__=='__main__':

    duck=Duck()

    cat=Cat()

    tree=Tree()

    duck_demo(duck)

    duck_demo(cat)

    duck_demo(tree)  #报错

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容