文章目录
-
- 1. 前言
- 2. 类和对象的概念
- 3. 类的成员
- 4. 新式类和旧式类
- 5. 静态变量和实例变量
- 6. 静态函数
- 7. 面向对象三要素
-
- (1) 继承
- (2) 封装
- (3) 多态
- 8. 抽象类
- 9. 单例模式
- 10. 后记
1. 前言
光棍节就要到了,一说介绍对象,我猜你一定想到了派森大叔家的克蕾丝(class)小姐姐和黛夫(def)小哥哥。别想入非非了,严肃点儿!我们今天的的话题,不是介绍男女朋友,而是讲解如何面向对象编程,也就是程序员常说的OOP啦。
不知道前辈们为什么会把 Object Oriented Programming 翻译成面向对象编程,搞得单身程序员经常心猿意马地产生幻觉,以为屏幕上的俊男美女就是自己将来要面对的对象了。说到这里,我觉得还是台湾同行的计算机术语翻译得较为恰当。比如,cache,我们叫“缓存”,人家叫“快取”,音意俱佳。台湾同行把OPP翻译成“物件导向编程”——虽然同样不明觉厉,但至少可以让单身程序员暂时忘记没有“对象”的烦恼。
限盐少许,本博主正式开始为大家介绍对象。
2. 类和对象的概念
学习面向对象编程,首先得搞明白,什么是对象是什么例化是什么意思图表达了我对OOP这几个基本概念的理解(实际上是妥协的结果——我和我的同事们讨论了很久,并翻墙参考了维基百科的说法)。
当类被实例化为对象时,首先执行构造函数,当对象被销毁时,会自动执行析构函数。一般的,我们会在构造函数中进行初始化工作,在析构函数中进行清理工作。
读到这里,有很多初学者一定会说:我定义类的时候,写过构造函数,但从没有写过析构函数,你为什么说所有的类都有构造函数和析构函数呢错,定义类的时候,即便我们不写构造函数和析构函数,这两个方法也照样存在(析构函数稍微有点特殊,我们不能直接看到它——除非是我们自己定义的)。如果我们自己定义了构造函数和析构函数,则将会取代系统自动赋予的这两个函数。下面的例子清晰地说明了其中的奥秘:类A既没有构造函数,也没有析构函数,类B只有析构函数,两个类都可以生成类实例,也都可以销毁,且 del b 时首先调用了自定义的析构函数。
4. 新式类和旧式类
在py2中,类有新式类和旧式类两种。新式类需要继承自虚类object,旧式类则不需要。py2中类的写法有三种:
class A(object):新式类写法
class A():旧式类写法
class A:旧式类写法
在py3中,只有新式类,不再支持旧式类。你如果习惯继承object的写法,也完全没有问题。上面三种写法在py3中都被解释成新式类。新式类和旧式类的主要区别是:
-
新式类可以继承object的构造函数和析构函数,如果类的构造和析构函数没有特别的工作,可以省略。而旧式类则不能:
此时用py2运行,会出现错误:,使用py3不会出现此错误。若改成新式类写法:
仍然用py2运行,则都不会出错。
-
新式类可以使用super:
-
多重继承时,各父类的初始化和函数查找顺序不同:旧式类为深度优先继承,新式类为广度优先继承。
5. 静态变量和实例变量
在构造函数中定义的变量,我们称之为实例变量。实例变量只能在实例化后使用的方式访问。静态变量一般定义在类的开始位置,独立于构造函数之外。静态变量既可以的方式访问,也可以的方式访问。通常,类的静态变量一般用于保存类的静态属性,该属性可被类的方法使用,但不应该被类的方法修改。
6. 静态函数
与其他语言的静态函数不同,python的静态函数有两种,都是用装饰器实现的:
staticmethod 函数不能使用self参数,因此不成访问任何成员变量,只能通过类名访问类的静态变量。
classmethod 函数也不能使用self参数,因此不成访问任何成员变量,但它有cls参数。cls参数不是对象的引用,而是类的引用,可以通过cls参数访问类的静态变量。
7. 面向对象三要素
面向对象,有三大要素:继承、封装、多态。这里面概念非常多,往往越讲越糊涂。为了不至于误导读者,我尽可能不做解释,只给出例子,请自行揣摩。
(1) 继承
如果派生类只有一个父类,就是单继承。这是最常见的类定义形式。
如果派生类有多个父类,就是多继承。
class Deer: def showHorns(self):print('我有鹿角')class Horse: def showFace(self):print('我有马脸')class Cow: def showHoof(self):print('我有牛蹄')class Donkey: def showTail(self):print('我有驴尾')class Milu(Deer, Horse, Cow, Donkey): # 多继承派生出一个四不像类 def __init__(self):Deer.__init__(self)Horse.__init__(self)Cow.__init__(self)Donkey.__init__(self)milu = Milu()milu.showHorns()milu.showFace()milu.showHoof()milu.showTail(声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!