《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器
准备工作
>>> class NewStyle(object):
more_code_here
>>> class OldStyle:
more_code_here
在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类。
构造方法
构造方法,当一个对象被创建后,会立即调用构造方法。Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__ :
>>> class Foobar:
def __init__(self):
self.somevar = 42
>>> f = Foobar()
>>> f.somevar
42
- 重写一般方法和特殊的构造方法
每个类都可能拥有一个或者多个超类,它们会从超类那里继承行为方式。如果一个方法在B类的一个实例中被调用,但在B类中没有找到该方法,那么就会去它的超类A里面找。考虑下面的两个类:class A: def hello(self): print "Hello, A!" class B(A): passA类定义了一个叫做hello的方法,被B类继承:
>>> a=A() >>> b = B() >>> a.hello() Hello, A! >>> b.hello() Hello, A!
使用这个定义,b.hello()能产生一个不同的结果
>>> class B(A): def hello(self): print "B" >>> b = B() >>> b.hello() B重写是继承机制中一个重要内容。
下例:
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaaah...' self.hungry = False else: print 'No thx!' pass class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' def sing(self): print self.sound运行:
>>> sb = SongBird() >>> sb.sing() Squawk! >>> sb.eat() Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> sb.eat() File "C:/Users/User/Desktop/Python_Demo/c_3.py", line 5, in eat if self.hungry: AttributeError: SongBird instance has no attribute 'hungry'异常很清楚地说明了错误:SongBird没有hungry特性。原因是在SongBird中,构造方法被重写,没有初始化hungry特性的代码。
- 调用未绑定的超类构造方法
写解决上例的问题,代码如下:class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaaah...' self.hungry = False else: print 'No thx!' pass class SongBird(Bird): def __init__(self): Bird.__init__(self) #banding method self.sound = 'Squawk!' def sing(self): print self.sound运行结果:
>>> sb = SongBird() >>> sb.eat() Aaaaah... >>> sb.eat() No thx!
为什么会有注意的结果?在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(这被称为绑定方法)。但如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定。这样就可以自由地提供需要的self参数。这样的方法称为未绑定(unbound)方法。
- 使用super函数
__metaclass__ = type class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaaah...' self.hungry = False else: print 'No thx!' pass class SongBird(Bird): def __init__(self): super(SongBird,self).__init__() self.sound = 'Squawk!' def sing(self): print self.sound运行结果如下:
>>> sb = SongBird() >>> sb.eat() Aaaaah... >>> sb.eat() No thx!
成员访问
- 基本的序列和映射规则
序列和映射是对象的集合。为了实现它们基本的行为,如果对象是不可变的,那么就需要使用两个魔法方法,如果是可变的则需要使用4个。
__len__(self):这个方法应该返回集合中所含项目的数量。(序列:返回个数;映射:返回键-值对的数量;返回0,对象会被当做一个布尔变量中的假值进行处理)
__getitem__(self.key):这个方法返回与所给键对应的值。对于一个序列,键应该是一个0~n-1的整数(也可能是负数,n是序列的长度);对于映射来说,可以使用任何种类的键。
__setitem__(self,key,value):这个方法应该按一定的方式存储和key相关的value,该值随后可使用__getitem__来获取。
__delitem__(self,key):这个方法对一部分对象使用del语句时被调用,同事必须删除和元素相关的键。 - 子类化列表、字典和字符串
属性
- property 函数
__metaclass__ = type class Rectangle: def __init__(self): self.width = 0 self.height = 0 def setSize(self,size): self.width,self.height = size def getSize(self): return self.width,self.height size = property(getSize,setSize)运行结果:
>>> r = Rectangle() >>> r.width = 10 >>> r.height = 5 >>> r.size (10, 5) >>> r.size = 150,100 >>> r.height 100
size特性仍然取决于getSize和setSize中的计算。
迭代器
- 迭代器规则
迭代的意思是重复做一些事很多次。
__iter__方法返回一个迭代器(iterator),所谓的迭代器就是具有next方法的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。class Fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.a,self.b = self.b,self.a + self.b return self.a def __iter__(self): return self fibs = Fibs() for f in fibs: if f>1000: print f break - 从迭代器得到序列
除了在迭代器和可迭代对象上进行迭代外,还能把它们转换为序列:class TestIterator: value = 0 def next(self): self.value += 1 if self.value >10:raise StopIteration return self.value def __iter__(self): return self运行结果:
>>> ti = TestIterator() >>> list(ti) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成器
生成器也叫简单生成器。
生成器是一种用普通的函数语法定义的迭代器。
- 创建生成器
>>> nested = [[1,2],[3,4],[5]] >>> def flatten(nested): for sublist in nested: for element in sublist: yield element >>> for num in flatten(nested): print num 1 2 3 4 5任何包含yield语句的函数称为生成器。
- 递归生成器
- 通用生成器
生成器是由两部分组成:生成器的函数和生成器的迭代器。
生成器的函数是用def语句定义的,包含yield的部分,生成器的迭代器是这个函数的返回部分 - 生成器方法
- 模拟生成器
(目前难以结合实例来学习,故此文档笔记暂时高于段落,每天开始研究自动化测试,Python核心编程课后习题)
《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器的更多相关文章
- Jquery基础教程第二版学习记录
本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...
- 《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器(上)
构造方法 在Python中创建一个构造方法很容易.只要把init方法的名字从简单的init修改为魔法版本__init__即可: >>> class FooBar: ... d ...
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- <<Python基础教程>>学习笔记 | 第04章 | 字典
第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...
- <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...
- python基础教程第二版 第一章
1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver
1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...
随机推荐
- Win7-其中的文件夹或文件已在另一个程序中打开
Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”. 步骤阅 ...
- 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)
Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志access_log #日志格式设 ...
- Linux之SAMBA共享服务
简述 Samba服务器可以让Windows操作系统用户访问局域网中Linux主机,就象访问网上邻居一样方便. 具有以下功能: 共享目录:在局域网上共享某个或某些目录,使得同一个网络内的Windows用 ...
- 【Linux高频命令专题(13)】cat
概述 常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一 ...
- java -version
- WCF入门(九)--WCF实例管理
这组由Windows通讯基础(WCF)结合一组消息(客户端请求)服务实例所采用的技术被称为实例管理.一个完全由三种类型实例激活支持WCF,它们如下所述. 1.每个调用服务 每次调用服务是Windows ...
- CF198 D2
B. Maximal Area Quadrilateral 题意:在N个点中构建四边形,使得四边形面积最大,且不自交. 分析:不自交四边形可以剖分成两个三角形,因此可以在O(N^2)内枚举对角线,然后 ...
- phantomjs使用说明
phantomjs使用说明 12条评论 phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取. ...
- 关于imx6核心板qt系统U盘挂载
在使用imx6核心板开发的时候,程序写到U盘,想通过U盘在板子上运行程序,U盘插到板子上后在minicom中有信息显示,但是无法找到挂载文件,/dev和/mnt下都没有找到相应的文件.后来百度后发现U ...
- linux 命令学习大全
转载 http://blog.csdn.net/xiaoguaihai/article/details/8705992/