如何通俗易懂理解 Python 类和面向对象?
全文 5000 字,带你彻底搞懂 Python 类、对象、面向对象、继承、属性、方法。。。。
面向对象的编程(Object-Oriented Programming ,OOP),每当看到这个术语,我们就会把它与 Java 联系起来。
事实上,Java 普及了面向对象的编程风格,除了 Java 之外,还有很多 OOP 语言,例如,C++、C#、Swift、JavaScript、php 等,当然,也包括 Python。
Python 提供了一种面向对象的编程风格,今天,我就来循序渐进的讲解一下 Python 面向对象,保证哪怕是零基础小白在看完这篇文章后也能够彻底搞明白 Python 面向对象。
在本文中,我将从如下几个主题给大家介绍 Python 面向对象编程的基础知识:
类
对象
继承
属性
方法
1 基本概念
1.1 类
什么是 OOP 中的类?
首先,借助一张图片来理解这个概念。
从上面图片,我们可以看到如下信息:类、对象、属性、方法和一只皮卡丘。
这与 OOP 有什么关系?
好吧,上面的图片正是帮助我们理解 OOP 概念的东西。
所以,现在进入第一个话题。
OOP 中的类是什么意思?类的定义是 "类是同一类型的对象的集合"。
把这个定义与上面的例子联系起来。
在这幅图中,我们可以看到有一个名为 小精灵(Pokemon)的矩形框,这就是类的名称。
因此,简而言之,类只不过是一个对象的集合。因此,在 pokemon 宇宙中的所有 pokemon 都在 "pokemon"类下。
为了确保理解,再讲一个示例。
以我们经常会见到的汽车为例,日产、特斯拉、福特、丰田,这些可以理解为一个个的对象,而“汽车”则是这一系列对象的合成、集合。
1.2 对象
前面已经反复的提到对象这个概念,接下来再具体的解释一下。
在 OOP 中,对象是一个类的组成部分或成员。考虑到我们的小精灵例子,每个小精灵都是小精灵类的一个对象。比如说。皮卡丘是口袋妖怪类的一个对象。比如说,丰田就是汽车的一个对象。
1.3 属性
回到我们的 Pokemon 例子,让我们专注于图像中的皮卡丘。观察它一会儿。你看到了什么?
通过观察皮卡丘的图像,我们可以看到它有两只耳朵,两只手,两条腿,脸颊上有两个红色的小圆点,还有一个显著的黄色。
在图片中的邻接表格中,我们还看到了一些东西,例如,名称="皮卡丘",类型="电动"和健康状况=70。
因此,所有这些都被称为属性,属性是提供关于类或对象的额外信息的元素。
在这种情况下,所有这些属性都提供了关于皮卡丘对象的额外信息,如颜色、健康状况等。
1.4 方法
在 Pokemon 示例中,在图表中可以看到诸如 attack(), dodge(), evolve()这些东西,这就是所谓的方法。
更简单地解释,方法基是与某个特定对象相关的动作。
在这种情况下,这些动作与我们的皮卡丘对象有关。
到此为止,想必很多同学对面向对象中的一些概念有了基本的了解。
下面,就实践起来,看一下 Python 面向对象到底该怎么用。
2 实践
2.1 创建类
正如你从上面的代码中所看到的,在 Python 中创建一个类时,需要遵循一定的结构。
以关键字 class 开头,通过这种方式,Python 可以识别出我们要创建的东西将被视为一个类。
关键字 class 之后是类的名称,在本例中是 Pokemon。
最后,它的后面是(),然后是:字符。
当然,到这里类还没有创建好,还需要一些其他的内容。
创建**init**方法
继续我们的类的创建任务,下一步涉及到创建一个非常特殊的方法,名为__init__。
你可能会问:这个__init__方法是什么?
为了简单理解这个概念,可以认为 init 方法类似于 Java 中的构造方法。
我之前专门写过一篇文章进行介绍,想深入了解的可以看一下:
先给出具体代码:
从上面代码可以看到,已经在 Python 中创建了__init__方法。
在这里,我们注意到一件事,那就是名为 def 的关键字,在 Python 中主要用于创建函数或者方法使用。
添加属性
目前已经定义了__init__( )方法,但是,它仍然没有被完全定义。仍然需要在__init__( )方法中传递某些参数来完成它的定义。
接下来,让给__init__( )方法中添加这些参数。
从上面代码可以看到,我在__init__( )方法中传递了很多参数。现在让我们回过头来了解一下这里传递的是什么参数。
还记得前面介绍的概念吧?我们讨论过皮卡丘是黄色的,脸颊上有两个红点,等等。这些是与一个对象相关的属性,在这个__init__ ( )方法中,我们定义这些属性。
除此之外,再解释一下另外一个问题:self 的用途是什么?
简单地解释一下,self 是一个关键字,负责将这些属性连接到我们的类,也就是本例中的 Pokemon。
2.2 创建方法
到此为止,我们已经声明了我们的类,名为__init__()的特殊方法和类的属性。
接下来,继续进行最后的部分,即方法的创建。
正如你可以从上面的代码中看到的,我创建 3 个名为 attack()、dodge()、evolve()的方法。
观察这段代码,你可以看到我们为每个方法都传递了一个名为 self 的参数。在这里,正在使用 self 关键字将这个方法与我们的类连接起来。
到此为止,就创建了一个完整的类。
2.3 创建对象
首先,给出创建对象的代码,在这里我创建了一个名为 pk1 的对象:
创建完对象之后,我们就可以做很多操作。
访问属性
我们可以通过<对象名>.<属性>的方法来访问对象的属性,来看一下具体的代码:
访问方法
访问方法和访问属性类型<对象名>.<方法>,同样,用具体代码来更加清晰的解释一下:
到这里,就讲解完了 Python 面向对象编程的基本内容。
下面,就再进阶一下,介绍一下面向对象编程中的继承。
2.4 继承
继承是 OOP 中的关键概念之一,同样,借助一个简单的例子来更加轻松理解这个概念。
考虑一个超级跑车的例子,迈凯轮 720S spyder,这是一辆超级跑车。
正如你所看到的,像大多数其他汽车一样,它有一些共同的特征,如门,挡风玻璃,4 个轮子,头灯,尾灯,等等。
然而,由于它是一辆超级跑车,它有自己的定制特征,如 720 马力的 V8 涡轮增压发动机,由迈凯轮开发的定制变速箱,以及定制的 AWD(全轮驱动)系统。
现在将其与面向对象的术语联系起来,我们可以说这辆车是从它的父类中继承了某种特征,在这种情况下,它首先是一个汽车类。
这就是 "继承"背后的概念。
继承是一种现象,一个元素从它的父类中获得特征。在这种情况下,迈凯轮 720S spyder 继承了汽车类的所有共同特征,但与此同时,它本身也有某些特殊的特征。
超类和子类
我们的元素所继承的类(本例中的汽车类)被称为超类(Superclass),它具有通用性。
而继承这些特征的类被称为子类(Subclass),它在本质上是特殊的。
接下来,在 Python 中实现这些概念。
在这个例子中,我将创建两个类--一个是名为 Car 的类,它就是超类。另一个是名为 McLaren 的类,它是子类。这个 McLaren 类将继承 Car 类的所有属性。
在这里,已经创建了第一个名为 Car 的类。
现在,我们将创建一个名为 McLaren 的新类,它将继承这个类的所有属性。
正如你在上面的代码中看到的,由于 McLaren 类继承了 Car 类,我们在创建 McLaren 类时把 Car 作为参数之一,这是 Python 类继承一种机制。
下面,我们创建一个 McLaren 的对象,验证一下它是否继承了 Car 特征。
然后,再访问一下对象的属性:
在这里我们可以看到,我们能够访问 McLaren 对象中专门定义的特殊属性,这些属性在基类 Car 中是没有的。
在这里我们继承了我们的基类,让我们看看基类中的那些属性是否在我们的 McLaren 类中被继承了。
可以看到,新创建的 McLaren 类的对象继承了 Car 基类的所有特征,表明在这个上下文中,继承被正确地实现了。
到此为止,从基本概念到实践,涵盖 Python 中类、对象、特殊方法、属性、方法等概念和具体实现,已经全面的介绍了 Python 面相对象中的相关知识和内容,是不是已经彻底了解 Python 面相对象了?
版权声明: 本文为 InfoQ 作者【Jackpop】的原创文章。
原文链接:【http://xie.infoq.cn/article/a62dccf302c6f1f2815bc620e】。文章转载请联系作者。
评论