### 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. CSU 1081 集训队分组

    题意:有n个学生,比了一场比赛,但是榜单看不到了.现在告诉你m段信息,每段信息的内容是(a,b),表示a的排名比b的高.问你能不能根据这些信息得出这场比赛的前k名. 思路:用拓扑排序找出一组符合k个人 ...

  2. Unity-WIKI 之 AnimationToPNG

    组件功能 把3D角色的动画录制成PNG一帧一帧输出,这是一个件多么美好的事! 可能遇到问题 有可能当你新建完脚本时会出现下面的错误: `System.IO.File' does not contain ...

  3. ViewPager -- Fragment 切换卡顿 性能优化

    当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快速切换ViewPager,即 Fragment需要加载UI内容,而又频繁地切换Fragment, ...

  4. rsync+inotify实时同步环境部署记录

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足.首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件 ...

  5. 第三章 Models模块属性详解

    摘自:http://www.cnblogs.com/xdotnet/archive/2012/03/07/aspnet_mvc40_validate.html 了解了这些就可以对MVC进一步认识,相信 ...

  6. 【C#】【Thread】上下文同步域SynchronizationAttribute

    上下文同步:使用SynchronizationAttribute为ContextBoundObject对象创建一个简单的自动的同步. 这种同步方式仅用于实例化的方法和域的同步.所有在同一个上下文域的对 ...

  7. 【MFC】ID命名和数字约定

    ID命名和数字约定 MFC ID 命名和数字约定需要满足以下要求: 提供对 Visual C++ 资源编辑器支持的 MFC 库和 MFC 应用程序中使用的一致的 ID 命名标准. 这样就可以轻松地对程 ...

  8. [转]VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1985084.html VMWare提供了三种工作模式,它们是brid ...

  9. NET Memory Profiler 跟踪.net 应用内存

    NET Memory Profiler 跟踪.net 应用内存 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇 作者:肖波      .net 框架号称永远 ...

  10. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...