### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象

21. 动态类型:对象/引用

对象和引用:

对象是储存在内存中的实体,对象名只是指向这一对象的引用(reference)。

对象和引用相分离是动态类型的核心。(Python会自动将没有引用指向的对象销毁(destruct),释放相应内存。)

可变数据对象/不可变数据对象:

列表list可以通过引用其元素,改变对象自身(in-place change),称为可变数据对象(mutable object),词典也是。

而像数字和字符串,不能改变对象本身,只能改变引用,称为不可变数据对象(immutable object)。

元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也是immutable object.

从动态类型看参数传递:

例子:

def f(x):                        def f(x):
    x = 100                          x[0]=100
    print x                          print x

a = 1                            a=[1,2,3]
f(a)                             f(a)
print a                          print a

输出:

100                                         [100,2,3]

1                                            [100,2,3]

区别及原因:

如果参数是不可变对象,a和x引用之间相互独立。对参数x的操作不会影响引用a。如果传递的是可变对象,那么改变函数参数,有可能改变原对象。

22. 多范式语言 multi-paradigm

程序不仅可以用面向对象的方式编写,也可以是面向过程。多范式依赖于特殊方法,也叫魔法方法(可见笔记9)。

Python的许多语法都是基于其面向对象模型的封装,对象模型是Python的骨架,功能完备。但是Python 也有更简洁的语法,从而必要时隐藏一些面向对象的接口。

运算符

可以简化书写,它们是通过特殊方法实现的。

所以在Python中,两个对象是否能够进行 比如 + 运算,首先要看对应的对象是否有__add__()方法。

'ABC' + 'abc'   #连接字符串

'ABC'.__add__('abc')   #两个是等价的

选择用面向对象的方法如  __add__() 或者+符号,取决于编程习惯。

内置函数

许多内置函数也都是对象的特殊方法。

比如len([1,2,3]) 其实也就是 [1,2,3].__len__()

表引用(list)

a=[1,2,3,4,5]

比如

print(li[3])  其实也就是调用了__getitem__()方法,a.__getitem__(2)

函数

任何一个具有 __call__()特殊方法的对象都可以当作是函数。

如:

class SampleMore(object):    def __call__(self, a):
        return a + 5
add = SampleMore()              # add是一个对象,也是一个 function object
print(add(2))
print(map(add, [2, 4, 5]))      # add  也可以作为函数对象传递给map函数

23. 标准库的itertools包

提供了更加灵活的生成循环器的工具,大都可以自行实现,只是更为高效和标准。

# import the tools
from itertools import *  # 或 import itertools

25. 上下文管理器

用于规定某个对象的使用范围,可以自动的关闭文件(根据程序块,也就是缩进)。

语法是 with ... as ...

# without context managerf = open("new.txt", "a")
print(f.closed)               # the file is openf.write("Hello World!")
f.close()                     # need to close after endprint(f.closed)               # the file is closed

以及:

# with context managerwith open("new.txt", "a") as f:   # with ... as ... open    print(f.closed)               # in, so open
    f.write("Hello World!") print(f.closed)                   # with ... as ... package end, so closed.

上下管理器,实际上是调用了文件对象的__enter__() 和  __exit__() 方法。在 __exit__()方法中,有self.close() ,就可以

自动关闭文件了。

自定义:

任何定义了__enter__() 和 __exit__()方法的对象,都可以用于上下文管理器。文件是内置对象,并不需要自定义。

class VOW(object):
    def __init__(self, text):
        self.text = text
    def __enter__(self):
        self.text = "I say: " + self.text    # add prefix
        return self                          # note: return an object
    def __exit__(self,exc_type,exc_value,traceback):
        self.text = self.text + "!"          # add suffix

with VOW("I'm fine") as myvow:
    print(myvow.text)

print(myvow.text)

在进入上下文和离开上下文时,对象的text属性发生了改变:

最初是 I'm fine --> I say: I'm fine(进入上下文时,前加 I say:) --> I say: I'm fine!(离开上下文时,后加!)

__exit__()中有4个参数,其中  exc_type,exc_value,traceback 3个参数用于描述异常,可以根据它们进行相应的处理。

如果程序正常结束,这三个参数为None.

python学习笔记4(对象/引用;多范式; 上下文管理器)的更多相关文章

  1. 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  2. Python学习笔记 (4) :迭代器、生成器、装饰器、递归、正则表达式等

    迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是 ...

  3. Python深入02 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  4. python 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  5. 浅淡python中的with,上下文管理器

    例子一 首先来看一段代码: class Foo(object): def __init__(self): print('实例化一个对象') def __enter__(self): print('进入 ...

  6. 【Python】 上下文管理器和contextlib

    上下文管理器 一直对python中的上下文管理比较迷惑,趁着今天研究SQLAlchemy顺便看了一下,感觉稍微清楚了一点.http://www.cnblogs.com/chenny7/p/421344 ...

  7. python学习笔记之module &amp;&amp; package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  8. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  9. 【python学习笔记】7.更加抽象

    [python学习笔记]7.更加抽象 类的定义就是执行代码块 在内存保存一个原始实例,可以通过类名来访问 类的实例化,是创建一个原始实例的副本, 并且所有成员变量与原始实例绑定 通过修改实例变量,可以 ...

随机推荐

  1. 无法打开之前cuda的vs项目,打开之后变灰色

    解决办法: 打开convolution_vs2010.vcxproj文件,将之前cuda 5.5全部改成cuda7.5. 就可以打开了.

  2. servlet上传下载(任何格式的都可以)

    jar不能低于此版本,JDK1.6以上,否则户报错 <dependency> <groupId>commons-fileupload</groupId> <a ...

  3. 将图片的二进制字节字符串在HTML页面以图片形式输出

    具体实现代码如下: 1.新建一个一般处理程序: Image.ashx using System; using System.Collections.Generic; using System.Linq ...

  4. mysql命令详解

    mysqld.exe 和 mysql.exe 有什么区别? mysqld.exe 是MySQL后台程序(即MySQL服务器).要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库. ...

  5. DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写

    总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...

  6. linq多表join与group

    var query =from a in this.ObjectContext.siteInfo join b in this.ObjectContext.shopInfo on a.siteID e ...

  7. 使用xp光盘修复系统的方法步骤

    对于使用Windows XP系统的朋友来说,当系统出现崩溃或者系统使用时出现一些莫名其妙的错误时,你采用什么方法解决呢?一般都是采用重装系统或者使用Ghost恢复等. 但是使用这些方法各有缺陷,比如重 ...

  8. Mac 显示 Finder 隐藏文件

    显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defaults writ ...

  9. 2001. Counting Sheep

      After a long night of coding, Charles Pearson Peterson is having trouble sleeping. This is not onl ...

  10. 利用Formdata实现form提交文件上传不跳转页面

    作者:幻月九十链接:https://www.zhihu.com/question/19631256/answer/119911045来源:知乎著作权归作者所有,转载请联系作者获得授权. $('form ...