光棍节就要到了,要不要给你介绍个 python 对象?

文章目录

    • 1. 前言
    • 2. 类和对象的概念
    • 3. 类的成员
    • 4. 新式类和旧式类
    • 5. 静态变量和实例变量
    • 6. 静态函数
    • 7. 面向对象三要素
      • (1) 继承
      • (2) 封装
      • (3) 多态
    • 8. 抽象类
    • 9. 单例模式
    • 10. 后记

1. 前言

光棍节就要到了,一说介绍对象,我猜你一定想到了派森大叔家的克蕾丝(class)小姐姐和黛夫(def)小哥哥。别想入非非了,严肃点儿!我们今天的的话题,不是介绍男女朋友,而是讲解如何面向对象编程,也就是程序员常说的OOP啦。

不知道前辈们为什么会把 Object Oriented Programming 翻译成面向对象编程,搞得单身程序员经常心猿意马地产生幻觉,以为屏幕上的俊男美女就是自己将来要面对的对象了。说到这里,我觉得还是台湾同行的计算机术语翻译得较为恰当。比如,cache,我们叫“缓存”,人家叫“快取”,音意俱佳。台湾同行把OPP翻译成“物件导向编程”——虽然同样不明觉厉,但至少可以让单身程序员暂时忘记没有“对象”的烦恼。

限盐少许,本博主正式开始为大家介绍对象。

2. 类和对象的概念

学习面向对象编程,首先得搞明白,什么是对象是什么例化是什么意思图表达了我对OOP这几个基本概念的理解(实际上是妥协的结果——我和我的同事们讨论了很久,并翻墙参考了维基百科的说法)。

光棍节就要到了,要不要给你介绍个 python 对象?

当类被实例化为对象时,首先执行构造函数,当对象被销毁时,会自动执行析构函数。一般的,我们会在构造函数中进行初始化工作,在析构函数中进行清理工作。

读到这里,有很多初学者一定会说:我定义类的时候,写过构造函数,但从没有写过析构函数,你为什么说所有的类都有构造函数和析构函数呢错,定义类的时候,即便我们不写构造函数和析构函数,这两个方法也照样存在(析构函数稍微有点特殊,我们不能直接看到它——除非是我们自己定义的)。如果我们自己定义了构造函数和析构函数,则将会取代系统自动赋予的这两个函数。下面的例子清晰地说明了其中的奥秘:类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进行处理,非常感谢!

上一篇 2019年10月6日
下一篇 2019年10月6日

相关推荐