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.
转载于:https://www.cnblogs.com/skyEva/p/5377546.html
python学习笔记4(对象/引用;多范式; 上下文管理器)相关推荐
- 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- Linux学习笔记重新梳理20180702 之 yum软件包管理器
2019独角兽企业重金招聘Python工程师标准>>> Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中 ...
- python学习笔记(对象)
对象的魔力 创建自已对象是python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. ...
- Python 学习笔记——文件对象和操作
Python的文件处理和相关输入输出能力.介绍文件对象(它的内建函数,内建方法和属性),标准文件,同时讨论文件系统的访问方法,文件执行,以及相关文件模块. 一,内建函数open()和file() 语法 ...
- 【Node.js学习笔记五】npm(Node包管理器)命令行选项
Node包管理器(Node Packaged Manager,NPM) Node封装模块(Node Packaged Module,module) 选项 说明 示例 1 search 在存储 ...
- Rust学习笔记之非常好用的包管理器Cargo
包管理器 Rust 的 Cargo 应该算是众多包管理器当中非常好用的一个.如果接触过前端开发,对 npm/yarn 应该是不陌生的,Go 语言也有 go tool.这些包管理器用来下载正确的依赖库. ...
- Python学习笔记 day5
Python学习笔记 day5 参考/引用资料: 1.file a.打开文件方式(读写两种方式) 缓冲 with语句 b.文件对象的操作方法 c.学习对excel及csv文件进行操作 读写excel ...
- python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式
with语句 简单又安全 with open('1.txt','w') as f: f.write('hello,world') 上下文管理器 with语句之所以这么强大,背后是由上下文管理器做支撑的 ...
- 云学python (第5章对象带你飞之储存 上下文管理器pickle 包)《vamei-从Python开始学编程》 笔记
2.上下文管理器 文件操作常常和上下文管理器一起使用.上下文管理器(context manager)用于规定某个对象的使用范围.一旦进入或者离开该使用范围, 则会有特殊操作被调用,比如为对象分配或者释 ...
最新文章
- C++向量类模板(支持实数向量与复数向量的各种运算)
- oracle sql 平均分配 分组_SQL学习二
- R安德森-达令检验( Anderson-Darling Test)
- 深入学习SAP UI5框架代码系列之六:SAP UI5控件数据绑定的实现原理
- Cloud for Customer里点了Opportunity ID的超链接到进入overview page,背后发生了什么事?
- 高并发系统之降级特技
- spring data jpa和mybatis的不同
- 进程的一生@unix
- AD-快速查找元器件
- Oracle查询上周日期sql,Oracle 获取上周一到周末日期的查询sql语句
- “李记餐厅”微信点餐小程序+后台管理系统
- Unity 引擎开始从 Mono 迁移到 .NET CoreCLR
- 递归 (一): 递归思想与 C++ 中的递归函数及两个递归应用示例 (斐波那契, 汉诺塔)
- 夸奖对方代码写的好_不知道如何夸奖别人?五种赞美方式,让你得到你想不到的结果!...
- 解决VUE在浏览器全屏下监听不到Esc键盘事件
- Apache Solr任意文件读取漏洞复现
- 深度学习应用13电影评论情感分析
- php开发环境搭建和基础入门
- ICM20602六轴传感器-IIC通信模式
- 关于高频信号PCB挖空
热门文章
- 使用stanford nlp进行依存句法分析
- CSS3实现圆角效果
- Hadoop进阶之输入路径如何正则通配?
- Linux下修改时区
- HTTP协议头部与Keep-Alive模式详解-Content-Length Transfer-Encoding
- 大型K8s沙龙来啦,火速报名——Kubernetes Cloud Native Meetup
- 【360开源】Quicksql——更简单,更安全,更快速的跨数据源统一SQL查询引擎
- Dubbo(一) 使用Java RMI 实现RPC(远程过程调用)
- RabbitMq(十) 消息过期时间TTL介绍以及代码实现
- Ribbon的初始化源码