《Python基础教程(第二版)》学习笔记 -> 第七章 更加抽象
对象的魔力
- 多态:意味着可以对不同类的对象使用同样的操作;
- 封装:对外部世界隐藏对象的工作细节;
- 继承:以普通的类为基础建立专门的类对象
- 多态
① 多态和方法
绑定到对象特性上面的函数称为方法(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函数是多态特性的代表之一 ——可以对任何东西使用
- 封装
封装是对全局作用域中其他区域隐藏多余信息的原则。
封装并不等同于多态。多态可以让用户对于不知道是什么类(或者对象类型)的对象进行防腐调用,而封装是可以不用关心对象是如何构建的而直接进行使用。 - 继承
继承是可以让一个类从已写好的类方法中完全继承其特性和方法。
类和类型
- 类是什么
类--一个对象。
所有的对象都属于某一个类,称为类的实例。
举例:
百灵鸟类是“鸟类”的实例,当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类(subclass),所以“百灵鸟类”是“鸟类”的子类,“鸟类”是“百灵鸟类”的超类(superclass)。 - 创建子集的类
实例:__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语句会在函数定义的地方创建子集的命名空间。
- 特性、函数和方法
上例中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
- 类的命名空间
下面两个语句(几乎)等价:
def foo(x): return x*x
foo = lambda x: x*x
定义类时,所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间(class namespace)。这个命名空间可由类内所有成员访问。 - 指定超类
# -*- 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类中拿过来的(继承),所以不用重写它的定义 - 多个超类
源代码: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基础教程(第二版)》学习笔记 -> 第七章 更加抽象的更多相关文章
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- <<Python基础教程>>学习笔记 | 第04章 | 字典
第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...
- <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- Jquery基础教程第二版学习记录
本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...
- python基础教程第二版 第一章
1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...
- <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
- Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver
1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...
随机推荐
- C# get set方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Git fetch和git pull的区别(转)
原文: http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地 ...
- lintcode 中等题:permutations 全排列
题目 全排列 给定一个数字列表,返回其所有可能的排列. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个列表[1,2,3],其全排列为: [ [1,2,3], [1,3,2], [2,1,3 ...
- spring的两种属性注入方式setter注入和构造器注入或者自动注入
1.这里的属性自动注入,与注解配置bean是两回事.这里的自动注入,指的是bean属性的自动注入. bean属性自动注入,包括byNAme和ByType两码事. 2.所有的applicationCon ...
- Hibernate逍遥游记-第8章 映射组成关系(<component>、<parent>)
一. 1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- mysql 插入汉字 异常 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name'
今天使用mysql出现 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name' 异常 通过查找问题,发现是字段编码不支 ...
- linux常用头文件
http://blog.csdn.net/kokodudu/article/details/17361161 aio.h 异步I/Oassert.h 验证程序断言 complex 复数类complex ...
- linq 之左连接
List<ArticleModel> articleList = articleRepository.GetAllArticle(); List<UsersModel> use ...
- bzoj2326: [HNOI2011]数学作业
矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...
- RecyclerView 结合 CardView 使用
准备工作:导入 1.activity_mian.xml <android.support.v7.widget.RecyclerView android:id="@+id/recycle ...