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

### 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 xa = 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 openf.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 = textdef __enter__(self):self.text = "I say: " + self.text    # add prefixreturn self                          # note: return an objectdef __exit__(self,exc_type,exc_value,traceback):self.text = self.text + "!"          # add suffixwith 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.

posted on 2016-04-11 11:09 Suckseedeva 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/skyEva/p/5377546.html

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

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

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

  2. Linux学习笔记重新梳理20180702 之 yum软件包管理器

    2019独角兽企业重金招聘Python工程师标准>>> Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中 ...

  3. python学习笔记(对象)

    对象的魔力 创建自已对象是python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. ...

  4. Python 学习笔记——文件对象和操作

    Python的文件处理和相关输入输出能力.介绍文件对象(它的内建函数,内建方法和属性),标准文件,同时讨论文件系统的访问方法,文件执行,以及相关文件模块. 一,内建函数open()和file() 语法 ...

  5. 【Node.js学习笔记五】npm(Node包管理器)命令行选项

    Node包管理器(Node Packaged Manager,NPM) Node封装模块(Node Packaged Module,module)   选项 说明 示例  1  search  在存储 ...

  6. Rust学习笔记之非常好用的包管理器Cargo

    包管理器 Rust 的 Cargo 应该算是众多包管理器当中非常好用的一个.如果接触过前端开发,对 npm/yarn 应该是不陌生的,Go 语言也有 go tool.这些包管理器用来下载正确的依赖库. ...

  7. Python学习笔记 day5

    Python学习笔记 day5 参考/引用资料: 1.file a.打开文件方式(读写两种方式) 缓冲 with语句 b.文件对象的操作方法 c.学习对excel及csv文件进行操作 读写excel ...

  8. python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式

    with语句 简单又安全 with open('1.txt','w') as f: f.write('hello,world') 上下文管理器 with语句之所以这么强大,背后是由上下文管理器做支撑的 ...

  9. 云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记

    2.上下文管理器 文件操作常常和上下文管理器一起使用.上下文管理器(context manager)用于规定某个对象的使用范围.一旦进入或者离开该使用范围, 则会有特殊操作被调用,比如为对象分配或者释 ...

最新文章

  1. C++向量类模板(支持实数向量与复数向量的各种运算)
  2. oracle sql 平均分配 分组_SQL学习二
  3. R安德森-达令检验( Anderson-Darling Test)
  4. 深入学习SAP UI5框架代码系列之六:SAP UI5控件数据绑定的实现原理
  5. Cloud for Customer里点了Opportunity ID的超链接到进入overview page,背后发生了什么事?
  6. 高并发系统之降级特技
  7. spring data jpa和mybatis的不同
  8. 进程的一生@unix
  9. AD-快速查找元器件
  10. Oracle查询上周日期sql,Oracle 获取上周一到周末日期的查询sql语句
  11. “李记餐厅”微信点餐小程序+后台管理系统
  12. Unity 引擎开始从 Mono 迁移到 .NET CoreCLR
  13. 递归 (一): 递归思想与 C++ 中的递归函数及两个递归应用示例 (斐波那契, 汉诺塔)
  14. 夸奖对方代码写的好_不知道如何夸奖别人?五种赞美方式,让你得到你想不到的结果!...
  15. 解决VUE在浏览器全屏下监听不到Esc键盘事件
  16. Apache Solr任意文件读取漏洞复现
  17. 深度学习应用13电影评论情感分析
  18. php开发环境搭建和基础入门
  19. ICM20602六轴传感器-IIC通信模式
  20. 关于高频信号PCB挖空

热门文章

  1. 使用stanford nlp进行依存句法分析
  2. CSS3实现圆角效果
  3. Hadoop进阶之输入路径如何正则通配?
  4. Linux下修改时区
  5. HTTP协议头部与Keep-Alive模式详解-Content-Length Transfer-Encoding
  6. 大型K8s沙龙来啦,火速报名——Kubernetes Cloud Native Meetup
  7. 【360开源】Quicksql——更简单,更安全,更快速的跨数据源统一SQL查询引擎
  8. Dubbo(一) 使用Java RMI 实现RPC(远程过程调用)
  9. RabbitMq(十) 消息过期时间TTL介绍以及代码实现
  10. Ribbon的初始化源码