### 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 manager
f = open("new.txt", "a")
print(f.closed)               # the file is open
f.write("Hello World!")
f.close() # need to close after end
print(f.closed) # the file is closed

以及:

# with context manager
with 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. Python高级笔记(八)with、上下文管理器

    1. 上下文管理器 __enter__()方法返回资源对象,__exit__()方法处理一些清除资源 如:系统资源:文件.数据库链接.Socket等这些资源执行完业务逻辑之后,必须要关闭资源 #!/u ...

  2. Python学习笔记_Python对象

    Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...

  3. Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码

    我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...

  4. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

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

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

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

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

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

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

  8. python 上下文管理器

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

  9. 深入理解 Python 中的上下文管理器

    提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管 ...

随机推荐

  1. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

  2. 数据结构Java实现04----循环链表、仿真链表

    单向循环链表 双向循环链表 仿真链表 一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形 ...

  3. Unity Sample Bootcamp

    M4枪 射击特效 Gun.js源码 function GenerateGraphicStuff(hit : RaycastHit) { var hitType : HitType; var body ...

  4. Git技巧总结分享

    接触Git有很长一段时间了,从最初的不懂到逐渐熟悉运用,相比于SVN,更热衷于Git这一款强大的版本控制工具. 废话不多说,下面对Git做了一些技巧总结,在此分享下,希望能帮助到一些喜欢Git的朋友们 ...

  5. JS的Document属性和方法

    Attributes 存储节点的属性列表(只读)childNodes 存储节点的子节点列表(只读)dataType 返回此节点的数据类型Definition 以DTD或XML模式给出的节点的定义(只读 ...

  6. prepareStatement createStatement

    preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement. preparedstatemen ...

  7. C语言 函数理解(以数组做参数)

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int run(int *p){ // ...

  8. VMWare安装苹果操作系统OS X

    项目要求做一些简单的苹果开发尝试,由于苹果的各种开发要求在Macintosh机上进行,可是项目不值得为一次简单的尝试付出过多的购机费,所以只能另辟蹊径,跟别人学学怎么在虚拟机里面搞: http://j ...

  9. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  10. 安卓界面篇(一) 自定义一个topbar

    步骤一: 先在values 里 新建一个attrs.xml 来设置我们的属性值: <?xml version="1.0" encoding="utf-8" ...