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. autpmapper映射忽略某个属性

    1.直接加特性[IgnoreMap] 2.映射规则 CreateMap<BaseAccount, BaseAccountListDto>().ForMember(dest => de ...

  2. C语言复习6_doWhile循环

    基本语法 do{ 循环操作 }while(循环条件); 特点:先执行,再判断 先执行一遍循环操作 符合条件,循环继续执行 否则循环退出 例题: #include <stdio.h> #in ...

  3. SQL DISTINCT去掉重复的数据统计方法【转】

    SELECT指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格/ ...

  4. 初学Socket通信

    1.Socket:Socket就是套接字.客户端与服务器之间通信用的.Socket接口是TCP/IP网络的API. 2.SYN是TCP/IP建立连接时使用的握手信号.在客户端和服务器之间建立正常的TC ...

  5. 对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?

    首先先引用<JavaScript权威指南>里面的一句话来开始我的博客:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 因此,就出现了如下的几串代码: ...

  6. App功能测试

    App功能测试 1.  运行 1)App安装完成后的试运行,可正常打开软件. 2)App打开测试,是否有加载状态进度提示. 3)App页面间的切换是否流畅,逻辑是否正确. 4)注册 同表单编辑页面 用 ...

  7. JavaScript基础系列

    JavaScript基础系列 JavaScript是一种基于对象和事件驱动的客户端脚本语言. JavaScript的注释 // 单行 /**/ 多行注释 JavaScript变量,函数名和操作符都是区 ...

  8. [Swift]LeetCode87. 扰乱字符串 | Scramble String

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  9. [Swift]LeetCode1027. 最长等差数列 | Longest Arithmetic Sequence

    Given an array A of integers, return the length of the longest arithmetic subsequence in A. Recall t ...

  10. Spring设计模式_工厂模式

    先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址  https://github.com/w ...