准备工作


>>> 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
  1. 重写一般方法和特殊的构造方法
    每个类都可能拥有一个或者多个超类,它们会从超类那里继承行为方式。如果一个方法在B类的一个实例中被调用,但在B类中没有找到该方法,那么就会去它的超类A里面找。考虑下面的两个类:

    class A:
        def hello(self):
            print "Hello, A!"
    
    class B(A):
        pass

    A类定义了一个叫做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特性的代码。

  2. 调用未绑定的超类构造方法
    写解决上例的问题,代码如下:
    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)方法。

  3. 使用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!

成员访问


  1. 基本的序列和映射规则
    序列和映射是对象的集合。为了实现它们基本的行为,如果对象是不可变的,那么就需要使用两个魔法方法,如果是可变的则需要使用4个。
    __len__(self):这个方法应该返回集合中所含项目的数量。(序列:返回个数;映射:返回键-值对的数量;返回0,对象会被当做一个布尔变量中的假值进行处理)
    __getitem__(self.key):这个方法返回与所给键对应的值。对于一个序列,键应该是一个0~n-1的整数(也可能是负数,n是序列的长度);对于映射来说,可以使用任何种类的键。
    __setitem__(self,key,value):这个方法应该按一定的方式存储和key相关的value,该值随后可使用__getitem__来获取。
    __delitem__(self,key):这个方法对一部分对象使用del语句时被调用,同事必须删除和元素相关的键。
  2. 子类化列表、字典和字符串

属性


  1. 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中的计算。

迭代器


  1. 迭代器规则
    迭代的意思是重复做一些事很多次。
    __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
  2. 从迭代器得到序列
    除了在迭代器和可迭代对象上进行迭代外,还能把它们转换为序列:
    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]

生成器


  生成器也叫简单生成器。

  生成器是一种用普通的函数语法定义的迭代器。

  1. 创建生成器

    >>> 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语句的函数称为生成器。

  2. 递归生成器
  3. 通用生成器
    生成器是由两部分组成:生成器的函数和生成器的迭代器。
    生成器的函数是用def语句定义的,包含yield的部分,生成器的迭代器是这个函数的返回部分
  4. 生成器方法
  5. 模拟生成器

(目前难以结合实例来学习,故此文档笔记暂时高于段落,每天开始研究自动化测试,Python核心编程课后习题)

《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器的更多相关文章

  1. Jquery基础教程第二版学习记录

    本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...

  2. 《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器(上)

    构造方法 在Python中创建一个构造方法很容易.只要把init方法的名字从简单的init修改为魔法版本__init__即可: >>> class FooBar: ...     d ...

  3. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  4. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  5. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

    Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...

  6. 第二章、元组和列表(python基础教程第二版 )

    最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...

  7. python基础教程第二版 第一章

    1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...

  8. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  9. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

随机推荐

  1. 无法将 grub-efl-amd64-signed 软件包安装/target/ 中

    64位win7下U盘安装64位ubuntu12.04,出现[无法将 grub-efl-amd64-signed 软件包安装/target/ 中]的错误 1. 已经确认为 12.04.2 的 Bug B ...

  2. Linux开机启动流程

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程:       1)加载BIOS       2)读取MBR       3)Boot Loader       4)加载内核    ...

  3. Hibernate逍遥游记-第13章 映射实体关联关系-003单向多对多

    0. 1. drop database if exists SAMPLEDB; create database SAMPLEDB; use SAMPLEDB; create table MONKEYS ...

  4. python 类成员函数

    http://cowboy.1988.blog.163.com/blog/static/75105798201091141521583/ 这篇文章总结的非常好 主要注意的地方是 1,在类内调用成员函数 ...

  5. (转)java性能调优

    本文转自:http://blog.csdn.net/lilu_leo/article/details/8115612 一.类和对象使用技巧 1.尽量少用new生成新对象 用new创建类的实例时,构造雨 ...

  6. windows和linux共享文件

    一篇文章: 环境:主机操作系统 是Windows XP ,虚拟机 是Ubuntu 9.10,虚拟机是VirtualBox 3.08. 1. 安装增强功能包(Guest Additions) 安装好Ub ...

  7. Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决

    Laptop: ACER Aspire 5733-6629 Wireless:Lite-on HB125, CHIPS: Atheros AR9485 Ubuntu: 10.04LTS (2.6.32 ...

  8. 学习Hadoop不错的系列文章

    1)Hadoop学习总结 (1)HDFS简介 (2)HDFS读写过程解析 (3)Map-Reduce入门 (4)Map-Reduce的过程解析 (5)Hadoop的运行痕迹 (6)Apache Had ...

  9. 1346. Intervals of Monotonicity(dp)

    1346 简单dp #include <iostream> #include<cstdio> #include<cstring> #include<algor ...

  10. 1741. Communication Fiend(dp)

    刷个简单的DP缓缓心情 1A #include <iostream> #include<cstdio> #include<cstring> #include< ...