对象的魔力


  • 多态:意味着可以对不同类的对象使用同样的操作;
  • 封装:对外部世界隐藏对象的工作细节;
  • 继承:以普通的类为基础建立专门的类对象
  1. 多态
    ① 多态和方法
    绑定到对象特性上面的函数称为方法(method)

    >>> from random import choice
    >>> x = choice(['hello,world!',[1,2,'e','e',4]])
    >>> x
    [1, 2, 'e', 'e', 4]
    >>> x.count('e')
    2

    本例中,可以看出列表胜出,但是关键点在于不需要检测类型:只需要知道x有个叫做count的方法,带有一个字符作为参数,并且返回整数数值就够了。

    ②多态的多种形式
    很多函数和运算符都是多态的,但唯一能够毁掉多态的就是适用函数显示地检查类型,比如type,isinstance以及issubclass函数等,如果可能的话,尽量避免适用这些毁掉多态的方式,示例如下:

    >>> def length_message(x):
        print "The length of ",repr(x),"is",len(x)
    
    >>> length_message('Python')
    The length of  'Python' is 6
    >>> length_message({'Python':'best'})
    The length of  {'Python': 'best'} is 1
    >>> length_message([1,2,3,4])
    The length of  [1, 2, 3, 4] is 4
    >>> length_message((1,2))
    The length of  (1, 2) is 2

    repr函数是多态特性的代表之一 ——可以对任何东西使用

  2. 封装
    封装是对全局作用域中其他区域隐藏多余信息的原则。
    封装并不等同于多态。多态可以让用户对于不知道是什么类(或者对象类型)的对象进行防腐调用,而封装是可以不用关心对象是如何构建的而直接进行使用。
  3. 继承
    继承是可以让一个类从已写好的类方法中完全继承其特性和方法。

类和类型


  1. 类是什么
    类--一个对象。
    所有的对象都属于某一个类,称为类的实例。
    举例:
    百灵鸟类是“鸟类”的实例,当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类(subclass),所以“百灵鸟类”是“鸟类”的子类,“鸟类”是“百灵鸟类”的超类(superclass)。
  2. 创建子集的类
    实例:
    __metaclass__ = type
    class Person:
        def setName(self,name):
            self.name = name
        def getName(self):
            return sele.name
        def greet(self):
            print "Hello, world! I'm %s" % self.name
    

    运行结果:

    >>> foo = Person()
    >>> bar = Person()
    >>> foo.setName('Luke')
    >>> bar.setName('Anak')
    >>> foo.greet()
    Hello, world! I'm Luke
    >>> bar.greet()
    Hello, world! I'm Anak
    >>> 

    Person是类的名字,class语句会在函数定义的地方创建子集的命名空间。

  3. 特性、函数和方法
    上例中self参数事实上正是方法和函数的区别。方法将他们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供。所以可以讲特性绑定到一个普通函数上,这样就不会有特殊的self参数了:
    >>> class Class:
        def method(self):
            print 'I have a self!'
    
    >>> def function():
        print "I don't ..."
    
    >>> instance = Class()
    >>> instance.method()
    I have a self!
    >>> instance.method = function
    >>> instance.method()
    I don't ...

    又比如:

    >>> class Bird:
        song = "Python"
        def sing(self):
            print self.song
    
    >>> bird = Bird()
    >>> bird.sing()
    Python
    >>> birdsong = bird.sing
    >>> birdsong()
    Python
  4. 类的命名空间
    下面两个语句(几乎)等价:
    def foo(x): return x*x
    foo = lambda x: x*x
    定义类时,所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间(class namespace)。这个命名空间可由类内所有成员访问。
  5. 指定超类
    # -*- coding: cp936 -*-
    class Filter:
        def init(self):
            self.blocked = []
        def filter(self,sequence):
            return[x for x in sequence if x not in self.blocked]
    class SPAMFilter(Filter):#SPAMFilter 是 Filter 的子类
        def init(self): #重写init方法
            self.blocked = ['spam']

    运行结果:

    >>> f = Filter()
    >>> f.init()
    >>> f.filter([1,2,3])
    [1, 2, 3]
    >>> s = SPAMFilter()
    >>> s .init()
    >>> s.filter(['SPAM','Test','SPAM','pythom','SPAM'])
    ['Test', 'pythom']

    注意SPAMFilter定义的两个要点:

    ①这里用提供新定义的方式重写了Filter的init定义;
    ②filter 方法的定义是从Filter类中拿过来的(继承),所以不用重写它的定义

  6. 多个超类
    源代码:
    class Calculator:
        def calculate(self, expression):
            self.value = eval(expression)
    
    class Talker:
        def talk(self):
            print "Hi, my value is" , self.value
    
    class TalkingCalculator(Calculator,Talker):
        pass

    运行结果:

    >>> tc = TalkingCalculator()
    >>> tc.calculate('1+2*3')
    >>> tc.talk()
    Hi, my value is 7

    这种行为成为多重继承(multiple inheritance)。

小结


  • 对象:对象包括特性和方法。特性只是作为对象的一部分的变量,方法则是存储在对象内的函数。(绑定)方法和其他函数的区别在于方法总是将对象作为自己的第一个参数,这个参数一般称为self。
  • 类: 类代表对象的集合,每个对象(实例)都有一个类,类的主要任务是定义 它的实例会用到的方法。
  • 多态:多态是实现将不同类型和类的对象进行同样对待的特性——不需要知道对象属于哪个类就能调用的方法。
  • 封装:对象可以将他们的内部状态隐藏(或封装)起来。
  • 继承:一个类可以是一个或者多个类的子类。子类从超类继承所有的方法。可以使用多个超类。

《Python基础教程(第二版)》学习笔记 -> 第七章 更加抽象的更多相关文章

  1. <<Python基础教程>>学习笔记 | 第10章 | 充电时刻

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

  2. <<Python基础教程>>学习笔记 | 第04章 | 字典

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

  3. <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面

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

  4. <<Python基础教程>>学习笔记 | 第11章 | 文件和素材

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

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

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

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

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

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

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

  8. <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持

    备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...

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

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

随机推荐

  1. Java Socket文件上传

    客户端: import java.io.FileInputStream; import java.net.Socket; /** * Created by 290248126 on 14-5-11. ...

  2. 查杀linux线程指令

      工作中重启环境时常常出现内存溢出等等问题,往往需要查杀进程来帮助重启成功,下面就查杀线程的详细指令做下总结:   1.查找需要kill掉的线程: ps -elf|grep [线程关键信息] 比如: ...

  3. Android中ExpandableListView,每次只展示一个分组

    // 只允许打开一个分组 expandListView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override public ...

  4. lintcode :二叉树的最大深度

    题目: 二叉树的最大深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的距离. 样例 给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 5 这个二叉树的最大深度为3. 解 ...

  5. PCB走线角度选择 — PCB Layout 跳坑指南

    现在但凡打开SoC原厂的PCB Layout Guide,都会提及到高速信号的走线的拐角角度问题,都会说高速信号不要以直角走线,要以45度角走线,并且会说走圆弧会比45度拐角更好.狮屎是不是这样?PC ...

  6. MacOS安装phpMyAdmin几点问题

    1. 登录时出现“#2002 无法登录 MySQL 服务器”. 原因: phpMyAdmin为PHP编写,MacOS默认安装的php配置,设置mysql监听socket默认为/var/mysql/my ...

  7. cf 151 C. Win or Freeze (博弈 求大数质因子)

    题目 题意: 给一个数N,两人轮流操作每次将N变为一个N的非1非自身的因数,第一个无法进行操作的人获胜问先手是否有必胜策略,如果有的话在第二行输出第一步换成哪个数,如果第一步就不能操作则输出0数据规模 ...

  8. UVa 10294 (Pólya计数) Arif in Dhaka (First Love Part 2)

    Burnside定理:若一个着色方案s经过置换f后不变,称s为f的不动点,将置换f的不动点的数目记作C(f).等价类的数目等于所有C(f)的平均值. 一个项链,一个手镯,区别在于一个能翻转一个不能,用 ...

  9. UVa 11181 (条件概率) Probability|Given

    题意: 有n个人买东西,第i个人买东西的概率为Pi.已知最终有r个人买了东西,求每个人买东西的概率. 分析: 设事件E为r个人买了东西,事件Ei为第i个人买了东西.所求为P(Ei|E) = P(EiE ...

  10. Facebook存储技术方案:找出“暖性BLOB”数据

    Facebook公司已经在其近线存储体系当中彻底弃用RAID与复制机制,转而采用分布式擦除编码以隔离其所谓的“暖性BLOB”. 暖性?BLOB?这都是些什么东西?大家别急,马上为您讲解: BLOB—— ...