阅读 240

零基础学习 Python 之初识「类」

写在之前

如果你是第一次听说「类」 这个概念,把它单独的作为一个名词你可能会觉得怪怪的,总觉得前面缺少了修饰成分。其实,「类」是由 class 翻译过来的,它对应的英文单词是 class

基本概念

不论学什么,概念都是非常重要的,想要学得某学科的语言,就必须使用相应的概念。在学「类」的时候,我们除了「类」还要知道什么是 OOP,即「面向对象编程」。所以我们先来认识几个 「术语」,这些术语跟现实生活中的某些名字可能相像,但是代表的不同的含义。

1.问题空间

知道什么是「问题空间」 是一个搬砖的必备基础,我们下面来看一下《维基百科》中关于它的定义:

问题空间是问题解决者对一个问题所达到的全部认识状态,它是由问题解决者利用问题所包含的信息和已储存的信息主动构成的。

一个问题一般由三个方面来定义:初始状态(开始时的不完全的信息),目标状态(你希望获得的信息或状态),操作(从初始状态到目标状态所采取的步骤)。这三个部分加在一起定义了问题空间。

2.对象

这里的「对象」不是你的「对象」,英文单词是 Object,至于为什么翻译成对象我们不去追究,我们需要知道的是「Python 中的一切都是对象」,不管你是字符串,函数还是类,都是对象。

那你可能问了,Python 都是对象有什么用么?简直是太有用了,这说明 Python 是面向对象编程的!

大佬们对于对象的定义相当高深:「一个对象要有自己的状态,行为和唯一的标识;所有相同类型的对象所具有的结构和行为在它们共同的类中被定义」。大佬们的话确实有水平,但是这个定义对于初学者来说可能不太好理解。

其实简言之,对象应该具有属性(就是大佬们说的状态),方法(就是大佬们说的行为)和标识,但是标识是自动就完成的,所以我们一般不用管它,所以一个对象主要就是有属性和方法,属性是说这个东西是什么,方法是说这个东西能做什么。

3.面向对象

面向对象(OOP),是现在编程的主流。面向对象编程可以看作是一种在程序中包含各种独立且又互相调用的对象的思想,这个和传统正好相反,传统的思想主张将程序直接看作是一系列对计算机下达的指令,而面向对象编程中的每一个对象都应该能够接受数据,处理数据并且能将数据传达给其它对象,因此它们每一个都可以看作是一个小型的机器,即「对象」。

目前来说面向对象编程推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。当我们提到面向对象的时候,它不仅仅是指一种程序设计方法,更多意义上是一种程序开发方式。

4.类

在目前所流行的高级编程语言中,「类」 是必须要有的,我们先来看《维基百科》中的定义:

在面向对象编程中,类 (class) 是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。

对于类更严格点的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被成为该类的实例。类有接口和结构,接口描述了如何通过方法与类及其实例互相操作,而结构描述了一个实例中数据如何划分为多个属性。

支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。类的出现,为面向对象编程的三个最重要的特性(封装,继承,多态)提供了实现的手段。

看到这里,你或许有这么一个认识,要面向对象编程就要用到类,虽然不是很严格,但是我们可以这么说,当然了,反过来的话是不可以的。

写 “类”

类是对某一群具有同样属性和方法的对象的抽象,比如长翅膀会飞的的生物,我们把它们统一称为「鸟」。

这里我们以「漂亮小姐姐」为例,我们要定义类,就要抽象的找出共同的方面,我们用 class 来声明,然后后面跟着类的名字:

class 小姐姐:
                 pass
复制代码

我们在这里先不用 Python 来写,而是用不太像伪代码的方式来表示,主要是为了让大家先了解一下什么是什么:

class 小姐姐:
   皮肤 = 白色
   发色 = 黑色
   唱歌()
   跳舞()
复制代码

我们定义了一个叫小姐姐的类,后面没有带括号的是属性,带括号的是方法,其中的属性和方法,默认是所以的小姐姐都具有,这个类仅仅是对小姐姐们的通常抽象,并不是指某个具体的谁谁谁。

对于一个具体的小姐姐,比如西施,她就是上面定义的小姐姐这个类的具体化,这在编程中称为「小姐姐」类的实例:

西施 = 小姐姐()
复制代码

用上面的方式就是将「小姐姐」 类实例化了,所谓的实例,就是一个具体的东西。对于西施这个实例,就可以具体化一些属性,比如发色,还可以用一些具体的方法,比如唱歌,通常用「.」的方式,比如 西施.皮肤,就得到白色。

下面开始我们不用伪代码了,开始用真正的 Python 代码来了解类。

Python 是个不断发展的语言,于是有了 Python2 和 Python3 两个版本,在 Python2 中,类分为「新式类」和「旧式类」,但是在 Python3 中没有这种新旧之分,就只是 「类」而已,当然我们的用的版本还是 Python3。

创建一个 “类”

如何创建一个「类」,为了更普遍性的说明,我来写一个具有通常类的结构的类,请看下面的例子:

class Person:
   """
   具有通常类的结构的 Person 类
   """
   def __init__(self,name):
       self.name = name

   def get_name(self):
       return self.name

   def get_sex(self,sex):
       per_sex = {}
       per_sex[self.name] = sex
       return per_sex
复制代码

上面的 Person 类是一个很常见的类,下面我来对它就行逐一解释:

在 Python3 中所有的类都是 object 的子类,正是因为这个原因,所以不用像 Python2 中那样要把对 object 的继承写出来。

class Person:这是在声明创建一个名字是「Person」的类,关键词是 class,就和函数的 def 一样。类的名字按照惯例一般用大写字母开头,如果名字是两个单词,那么两个单词的首字母都要大写,比如 HotDog,当然了如果你不想这样也是可以的,但是我希望你记住 “你的代码是给别人看的”,不要给别人和自己以后读代码的时候带来麻烦。最后当所有的一切都结束的时候,别忘了在最后带上冒号。

接下来就是类里面的代码块,上面例子中类里的代码块看起来很熟悉,都是 def 这个关键词开头的函数。你是对的,它们就是函数,但是你仔细看一下就会发现,这些函数跟我们在前面学过的函数略微不同,它们的参数都有「self」(要注意 self 是默认的第一个参数)。这个正是类中函数的特色,是为了跟我们以前学过的函数区别开来,所以一般在类里的函数我们不叫它们函数,而叫它们 「方法」。所以当你听到有人说「方法」 的时候,不用奇怪,它和函数在本质上是一样的。

下面对类里的几个函数做一个简要的介绍。

def __init__(self,name):这是一个特殊的方法,以双下划线开头和结尾,这样的方法其实在类里面还有很多,统一叫它们「特殊方法」。对于 __init__() 还有一个别的名字,叫「构造函数」,也有叫它是「初始化方法」 的,个人认为第二个更好一点,因为单从字面上来看,它对应的含义应该是初始化。所谓的初始化,就是让类有一个基本的样子,而不是里面什么也没有,很多事情都要初始化,让事情有一个具体的起点状态,比如你要吃饭,碗里得先有饭。在用类创建实例的时候,首先执行的是初始化方法。

在上面的例子中,初始化方法里的参数除了 self 以外,还有一个 name,在 Person 类被实例化的同时,要传给它一个值。self.name = name 的意思是建立实例的一个属性,这个属性的名字也是 name,它的值等于参数 name 所传入的值。要注意的是,这里的属性 self.name 和参数 name 是纯属巧合,你也可以写成 self.aaa = name,只不过这样写会觉得很别扭。

接下来的 def get_name(self)def get_sex(self,sex) 是类里面的另外两个方法,这两个方法除了第一个参数必须是 self 以外,其它跟函数没有什么区别。你只需要注意的是,两个方法中都用到了 self.name,属性的这种调用方式只能在类里面使用。

“类” 的实例

类是对象的定义,实例才是真实的东西。比如「人」是一个类,但是「人」 终究不是具体的某个会喘气的,只有「rocky」才是具体的东西,但他是具有「人」 这个类所定义的属性和方法。「rocky」就是「人」这个类的实例。

我们继续用上面那个类的例子,直接写一下调用这个类的代码:

if __name__ == "__main__":
   boy = Person('rocky')
   print(boy.name)
   name = boy.get_name()
   print(name)
   his_sex = boy.get_sex('男')
   print(his_sex)
复制代码

上面代码中 girl = Person('rocky') 是利用上面的类创建的实例。创建实例的过程就是调用类 Person(),首先执行的是初始化函数,上述例子中的初始化函数有两个参数,即 self 和 name,其中 self 是默认参数,不需要传值,name 则需要给它传值,所以用Person('rocky') 的样式。

boy 就是一个实例,它有属性和方法,self.name 是它的属性,boy.get_name()boy.get_sex('男') 是通过实例来调用方法。

刚才是以 boy = Person('rocky') 的方式创建了一个实例,仿照这个样式还可以建立更多的实例,比如 girl = Person('xishi') 等,也就是说,一个类可以创建多个实例。

写在最后

这就是通过类创建实例,并且通过实例来调用属性和方法的过程,我感觉我已经说的很详细了,希望你能认真的看完。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。

在这里插入图片描述

关注下面的标签,发现更多相似文章
评论