在上一篇《手把手陪您学Python》39——面向对象中,我们介绍了面向对象编程、面向过程编程的概念,并用比较通俗的语言着重分析了两种编程思想之间的区别。
今天,我们将会对面向对象编程进行正式的讲解。
为了让大家更加直观地理解面向对象编程的规则和用法,我们将使用经典游戏《超级玛丽》作为实例,贯穿整个讲解过程,并将“马里奥Mario”作为面向对象编程中的“对象”加以应用。
1、定义类
Python中的“类”与我们现实生活中“类”的概念很相似,是对具有相同或者相似特征的事物的总称。
在生物中,花鸟鱼虫各是一类;在物品中,柴米油盐各是一类;在味道中,酸甜苦辣各是一类;在艺术中,琴棋书画各是一类;在学习中,语数外音体美也各是一类。
每一类都有这一类事物共同具有的一种或者多种相同的特征、用途、行为方式。同时,每一类又可以根据某种方式将其细分成更多的类,不同的类也可以依据某些相同的特征聚合成另一个大类。
凡是在现实生活中我们可以认为是一类的东西,在Python中也可以认为是一类,并且能够通过定义类的方式将其进行命名。
在Python中,定义类就像我们定义函数一样简单。定义类的关键词是class,之后是类名称和“:”。其中,类名称的第一个字母要大写,由于用“:”结尾,所以下面的语句同样也要缩进。
class 类名称:
语句1
语句2
。。。
2、类的属性
我们刚才说到,每一个类都有一个或者多个相同的特征,那么每一个这样的特征我们就称之为属性。
类的属性就是一个个变量名,我们可以将这个变量赋值,也就相当于对类的属性进行了描述。类的属性或者类的变量与我们之前学习的变量没有区别,数字、字符串、列表、字典、元组、集合等等,都可以作为变量的值,对类的属性进行描述。
回到我们的实例中,我们知道超级玛丽有很多的特征和能力,比如有三条命,带着红色的帽子,留着络腮胡,可以前进、后退、上跳,可以攻击,还可以吃蘑菇和花等等,我们要创建的马里奥类就包括这这些特征和能力。
这里我们先选取超级玛丽的两个特征作为这一类的属性,一个是有三条命,一个是帽子是红色的。那么类的属性就可以这样定义:
In [1]: class Mario:
life = 3
cap = "red"
无论是定义类还是定义属性,运行后都是没有结果的,要想应用,需要引用类的属性。
3、类属性的引用
引用类的属性时,可以很方便地在类的名字后面使用“.”来引用这一类的所有属性(即类的变量),其语法格式为:
类名称.类属性
那么,我们刚刚定义的马里奥类以及他的类属性就可以通过引用的方式来使用了。
In [2]: print(Mario.life)
Out[2]: 3
In [3]: print(Mario.cap)
Out[3]: red
通过引用我们可以看到,玛丽奥的生命值属性为3,帽子的颜色属性为red。这里的马里奥可不是玛丽奥自身,而是马里奥这一类,所有属于马里奥类的对象,都具有生命值为3,帽子颜色为red的属性。
4、类的实例化
既然所有的马里奥类都有着相同的属性,那么具体到某一个马里奥,也必然具有着整个马里奥类都具有的属性。
这个将马里奥类具体到某一个马里奥的过程就是实例化。这个具体的马里奥就是被实例化的对象,我们称之为实例,或者说是类的实例。
对于我们的游戏来说,按照马里奥类的特性出现的能够让我们控制的马里奥的过程就是实例化的过程。
如果用Python语言来描述实例化的过程,就是创建一个变量,也就是我们实例的名称,右边是类的名称。就像给一个变量赋值,实例化的过程实际是给变量赋予了整个类的属性。
实例名称 = 类名称
在游戏中,首先出现的马里奥是一个小号的马里奥,那么我们就先将这个小号马里奥实例化一下。
In [4]: small_mario = Mario()
运行以上程序,并没有什么输出,但实际上small_mario已经具有了马里奥类的全部属性,这一点可以通过引用类的属性来验证。
实例引用类属性的方法与类引用类属性的方法一样,只不过将类名称改为实例名称就可以了。
In [5]: print(small_mario.life)
Out[5]: 3
In [6]: print(small_mario.cap)
Out[6]: red
理解了这个过程之后,我们就可以用更为准确地语言来定义类的属性了,那就是可以通过实例进行访问的变量称为属性。
5、实例属性
通过刚才的引用,我们看到实例的属性与类的属性完全相同。那么实例可不可以有和类不同的属性呢?
当然可以,既然我们的现实生活中同一类的事物也都有着与其他同类不同的特征,那么在Python中,实例也必然会有着与类不同的特征。
我们将实例具有的与类不同的属性称之为实例属性。
既然属性是一种变量,那么实例属性也同样是个变量了。定义实例属性的过程实际上就是定义实例的一个变量的过程,其语法格式与引用类属性时方法一样,只不过需要通过赋值来描述其属性。
对于小玛丽奥来说,他的独特的属性,或者说实例属性就是“小号的”:
In [7]: small_mario.size = "small"
实例属性的引用与类属性的引用也完全一样,让我们引用小玛丽奥的实例属性来看一看:
In [8]: print(small_mario.size)
Out[8]: small
虽然实例具有类的属性,但反过来类是不具有实例的属性的。
In [9]: print(Mario.size)
Out[9]: ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-26-706a6eb6dc6d> in <module>
----> 1 print(Mario.size)
AttributeError: type object 'Mario' has no attribute 'size'
以上就是我们对于类定义、类属性及其引用、实例化及实例属性的讲解。作为面向对象编程的基础内容,后面还会有几篇文章的介绍,希望大家能够多多实践深入理解。如果有任何疑问,欢迎随时留言交流。
下一篇我们将会介绍类方法和实例方法,以及两种方法之间的差别,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手40”,即可免费下载本篇文章所用示例语句。