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.引用计数器:纪录当前引用货指向该对象的数量,一旦计数器被清零,该对象的内存空间就会被 ...
随机推荐
- tp5生成6位不重复验证码
/** * 获取激活码 */ public function getnum() { $time = Db::name('fangchan_jihuoma')->group('id desc')- ...
- angular.js学习笔记(一)
1.angular单项数据绑定 2.不要使用控制器的时候: 任何形式的DOM操作:控制器只应该包含业务逻辑.DOM操作则属于应用程序的表现层逻辑操作,向来以测试难度之高闻名于业界.把任何表现层的逻辑放 ...
- ubuntu 16.04卸载不必要默认安装软件
两个办法,一个在ubuntu软件里一个一个删,明显的windows下做法. 还有一个通过终端来删除.ctrl+alt+t打开终端. 1.卸载libreoffices(要删一起删了,然后去装office ...
- leetcode-查找和替换模式
一.题目描述 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配.如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我 ...
- Go接口interface
目录 接口是什么? interface类型 空接口(interface{}) interface函数参数 interface变量存储的类型 类型断言 嵌入interface 接口是什么? Go 语言不 ...
- #Java学习之路——基础阶段(第十篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- MySQL 规范及优化
一.建库建表优化 1.核心规范(推荐) 表字符集选择UTF8 (“表情”字段单独设置为其他字符集) 存储引擎使用INNODB 不在库中存储图片.文件等 使用可变长字符串(varchar) 每张表数据量 ...
- Java 11新功能抢先了解
目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...
- python的StringIO
有时候需要将 information 保存在本地,可以这样写: file = open("filename","w") file.close() file.cl ...
- Django+Bootstrap+Mysql 搭建个人博客(五)
5.1.自定义403,404和500页面 (1)website/urls.py from blog import views as blog_views handler403 = blog_views ...