python学习笔记(八)、特殊方法、特性和迭代器
1 新式类和旧式类
python类的工作方式在不断变化。较新的Python2版本有两种类,其中旧式类正快速退出舞台。新式类时Python2.2 引入的,提供了一些额外功能,如支持函数super 和 property,而旧式类不支持。要创建新式类,必须直接或间接的继承Object 或设置 __metaclass__。
2 特殊方法(魔法方法)
Python中有很多特殊方法,其名称以两个下划线开头和结尾。这些方法的功能各不相同,但大都由python 自动调用。
3 构造函数
在很多面向对象语言中都有构造函数这一概念,如java,主要用于对创建对象进行初始化。python中,构造函数名为__init__,在对象被创建后自动调用该方法。
注意:python还提供了一个在对象销毁前被调用,该方法为__del__,通常称它为析构函数。
4 方法重写
子类可对超类中定义的方法(以及其他任何属性)进行重写,为此只需实现这些方法即可。要调用被重写的版本,可直接通过超类调用为关联版本(旧式类),也可使用函数super()来调用(新式类)。
5 基本的序列和映射协议
5.1 协议
在python中,协议通常指的是规范行为的规则。在python中,多态仅仅基于对象的行为(而不是基于祖先,如属于哪个类或其超类等),因此,在python中,通常只要求对象遵循特定的协议。比如,要成为序列,只需遵循序列协议即可。
5.2 基本的序列和映射协议
序列和映射基本上是元素的集合,要实现他们的基本行为(协议),不可变对象(如元祖)需要实现2个方法,而可变对象(如序列)需要实现4个方法。
- __len__(self):这个方法应返回集合包含的项数。如果没有实现__len__方法,则表示无穷序列。
- __getitem__(self, key):这个方法应返回与指定键相关联的值。对序列来说,键应该是下标(0 ~ n-1或为-1 ~ -n)。对于映射来说可以是任何类型。
- __setitem__(self, key):这个方法应以与键相关联的方式存储值,以便以后能够使用__gititem__来获取。当然,仅对象可变时才需要实现这个方法。
- __delitem__(self, key):这个方法在对对象的组成部分使用__del__语句时被调用,应删除与key相关联的值。同样,仅对象可变时才需要实现这个方法。
对于这些方法,还有一些额外的要求:1.对于序列,如果键为负数,应从末尾往前数。即x[-n] 与x[len(x) - n] 等效; 2.如果键的类型不合适(如对序列使用字符串键),可能引发TypeError异常; 3.对于序列,如果所有的类型正确,但不在允许的范围内,应引发IndexError异常。
5.3 从list、dict和str派生
基本的序列和映射协议还能通过继承来实现。在python标志库中,模块collections提供了抽象和具体的基类,但你也可以继承内置类型,如list、dict和str等。
6 特性
在python中,通过存取方法定义的属性通常称为特性。
6.1 函数property
函数property(getmethod, setmethod, delmethod, doc)创建一个特性,可以不指定参数、指定一个参数、指定是三个参数或指定四个参数。如果没有指定参数,创建的特性即不可读也不可写。如果指定一个参数(只能为get),创建的特性是可读的。如果指定三个参数,指定用于删除的delmethod方法不接受任何参数。如果指定四个参数,第四个为一个文档字符串。如:
class Person:
def __init(self):
self.name = ''
self.age = 0
def setName(self, value):
self.name = value
def getName(self):
return self.name
permsg = property(getName, setName)
6.2 静态方法和类方法
静态方法和类方法是这样创建的:将他们分别包装在staticmethod和classmethod类的对象中。静态方法中没有参数self,可直接通过类来调用。类方法的定义中包含类似于self的参数,通常被命名为cls,可直接通过类来调用,cls参数自动关联到类。如:
class Person:
def static_method():
pass
static_method = staticmethod(static_method)
def class_method(cls):
pass
class_method = classmethod(class_method)
像这样手工进行包装盒替换的方法有点儿繁琐。而程序员都是比较懒得,所有在Python2.4 中引入了一种名为装饰器的新语法,可在方法(或函数)前面使用运算符@列出这些装饰器(指定多个装饰器是,应用顺序与列出顺序相反)。如:
class Person
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
6.3 __getattr__、__setattr__等方法
- __getattribute__(self, name):在属性被访问时自动调用(只适用于新式类)
- __getattr__(self, name):在属性被访问而对象没有这样的属性时自动调用
- __setattr__(self, name, value):视图给属性赋值时自动调用
- __delattr__(self, name):视图删除属性时自动调用
在实际操作中,如果想避免调用__setattr__方法,可以使用__dict__属性,该属性时一个字典,其中包含所有的实例属性。如:self.__dict__[name] = value 就不会再次调用__setattr__方法了。
7 迭代器
迭代表示可以重复多次。比如使用for方法进行循环迭代序列和字典,但实际也可以迭代其他对象,但是该对象必须实现了__iter__方法。
方法__iter__返回一个迭代器,它是包含__next__方法的对象。当调用__next__时,迭代器应返回其下一个值。如果没有了值进行返回,将引发StopIteration异常。你还可以使用内置的便利函数next,在这种情况下,next(it) 与 it.__next__等效。
注意:实现了方法__iter__的对象时可迭代的,而实现了方法__next__的对象是一个迭代器。
8 生成器
包含了关键字yield的函数表示一个生成器,是一种特殊的迭代器。函数在每次使用yield生成一个值后,都将冻结,即在此停止执行,并返回值,等待下次调用重新被唤醒,被唤醒后,函数将从停止的地方开始继续执行。
send(value):接受一个参数,表示要发送的消息,该value将代替上次的yield停止的位置。仅当生成器被挂起(即遇到第一个yield)后,使用send才有意义。
throw:用于在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型、一个可选择和一个traceback对象。
close:用于停止生成器,调用时无需任何参数。
python学习笔记(八)、特殊方法、特性和迭代器的更多相关文章
- python学习笔记八——字典的方法
4.3.3 字典的方法 字典的常用方法可以极大地提高编程效率.keys()和values()分别返回字典的key列表和value列表.例: dict={"a":"appl ...
- python 学习笔记八 进程和线程 (进阶篇)
什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执 ...
- Python学习笔记:魔术方法详解
准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...
- Python学习笔记八
类的高级用法 多态: 在其他语言,使用的是类的继承. 在python中,不需要指定数据类型. 基于TCP协议的socket通信实现: 类似于打电话的情景. 服务端: 1.买手机 2.插卡 3.开机 ...
- Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数
文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...
- Python学习笔记八:ORM框架SQLAlchemy
一:SQLAlchemy使用 1:实体类的创建 ORM中的实体类与一般的Python类不同,在其中,使用 __tablename__=""指明该类与数据库中某个表相对应,然后定义一 ...
- python学习笔记之split()方法与with
Python split()方法 以下内容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通过指定分隔符对 ...
- python学习笔记(八)-模块
大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...
- python学习笔记八--动态类型
一.变量,对象,引用: 1. 变量: 2. 对象:均包含了一个头部信息,有以下两部分内容 a.对象的数据类型, b.引用计数器:纪录当前引用货指向该对象的数量,一旦计数器被清零,该对象的内存空间就会被 ...
随机推荐
- Java语法细节 - 可见性
目录 JAVA访问和修饰符的关系一览表 JAVA访问和修饰符的关系一览表 Modifier Class Package Subclass World public Y Y Y Y protected ...
- Python函数式编程之闭包
-------------------------函数式编程之*******闭包------------------------ Note: 一:简介 函数式编程不是程序必须要的,但是对于简化程序有很 ...
- sqlmap Windows 安装教程
第一步:下载 python :https://www.python.org/downloads/ (这里有python各种版本,但是一般建议安装3和2.7) sqlmap:https://git ...
- 完整的系统帮助类Utils
//来源:http://www.cnblogs.com/yuangang/p/5477324.html using System; using System.Collections.Generic; ...
- 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识
第25章 DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...
- [Swift]LeetCode473. 火柴拼正方形 | Matchsticks to Square
Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...
- [Swift]LeetCode757. 设置交集大小至少为2 | Set Intersection Size At Least Two
An integer interval [a, b] (for integers a < b) is a set of all consecutive integers from ato b, ...
- [Swift]LeetCode777. 在LR字符串中交换相邻字符 | Swap Adjacent in LR String
In a string composed of 'L', 'R', and 'X'characters, like "RXXLRXRXL", a move consists of ...
- ubuntu中环境变量的几个问题思考
问题一:export PATH=$PATH:/usr/local和export PATH=/usr/local:$PATH这两个的区别是什么?可以随便用吗? 这两个都是要把该目录加到环境变量中,一般的 ...
- java集合框架整理
一.总体框架 Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* .Java集合主要可以划分为4个部分:Lis ...