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学习笔记(八)、特殊方法、特性和迭代器的更多相关文章

  1. python学习笔记八——字典的方法

    4.3.3 字典的方法 字典的常用方法可以极大地提高编程效率.keys()和values()分别返回字典的key列表和value列表.例: dict={"a":"appl ...

  2. python 学习笔记八 进程和线程 (进阶篇)

    什么是线程(thread)? 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执 ...

  3. Python学习笔记:魔术方法详解

    准备工作 为了确保类是新型类,应该把 _metaclass_=type 入到你的模块的最开始. class NewType(Object): mor_code_here class OldType: ...

  4. Python学习笔记八

    类的高级用法 多态:   在其他语言,使用的是类的继承. 在python中,不需要指定数据类型. 基于TCP协议的socket通信实现: 类似于打电话的情景. 服务端: 1.买手机 2.插卡 3.开机 ...

  5. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  6. Python学习笔记八:ORM框架SQLAlchemy

    一:SQLAlchemy使用 1:实体类的创建 ORM中的实体类与一般的Python类不同,在其中,使用 __tablename__=""指明该类与数据库中某个表相对应,然后定义一 ...

  7. python学习笔记之split()方法与with

    Python split()方法 以下内容摘自:http://www.runoob.com/python/att-string-split.html 描述 Python split()通过指定分隔符对 ...

  8. python学习笔记(八)-模块

    大型python程序以模块和包的形式组织.python标准库中包含大量的模块.一个python文件就是一个模块.1.标准模块 python自带的,不需要你安装的2.第三方模块 需要安装,别人提供的. ...

  9. python学习笔记八--动态类型

    一.变量,对象,引用: 1. 变量: 2. 对象:均包含了一个头部信息,有以下两部分内容 a.对象的数据类型, b.引用计数器:纪录当前引用货指向该对象的数量,一旦计数器被清零,该对象的内存空间就会被 ...

随机推荐

  1. dedecms给图片加水印覆盖整张图片

    位置: /include/image.class.php $wmwidth = $imagewidth - $logowidth; $wmheight = $imageheight - $logohe ...

  2. PyCharm下载及使用

    PyCharm教育版是一款能够对你编写Python程序的工作有所帮助的免费编译器. PyCharm-community下载链接:https://pan.baidu.com/s/1Hwd_TOVA3en ...

  3. springmvc的日期类型转换

      springmvc的日期类型转换 # spring mvc绑定参数之类型转换有三种方式: ## 1.实体类中加日期格式化注解 @DateTimeFormat(pattern="yyyy- ...

  4. 错误:Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file

    Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: /tmp/hsperfdat ...

  5. xgboost 多gpu支持 编译

    xgboost 多gpu支持 编译 Ubuntu 18.04.2Linux 4.15.0-46-genericgcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 cuda ...

  6. 对象池----unity中应用

    对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述. 以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!) 1).先建立一个(怪物)物体   mMonster; 2).再建立一 ...

  7. 机器学习之正则化(Regularization)

    1. The Problem of Overfitting 1 还是来看预测房价的这个例子,我们先对该数据做线性回归,也就是左边第一张图. 如果这么做,我们可以获得拟合数据的这样一条直线,但是,实际上 ...

  8. .net core 灵活读取配置文件

    using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using Syst ...

  9. Go语言单元测试与基准测试

    目录 单元测试 概述 go test参数解读 单元测试日志 基准测试 基础测试基本使用 基准测试原理 自定义测试时间 测试内存 控制计时器 Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码 ...

  10. Centos7中文乱码问题的解决

    刚安装centos7之后,语言默认不是中文,导致中文路径或中文文件在系统中显示为乱码,查了些资料解决了这个问题. 1 查看和安装中文库 [root@bogon ~]# echo $LANG zh_CN ...