作者:室长

大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。

书接上文,我们面对动物园甲方爸爸的要求有了一定的思路,它可以是这样的:

动物园所有的哺乳动物都有姓名、性别、年龄,那么我们就可以定义一个哺乳动物类,语句是这样写的:

Python in string找不到 python找不到对象_开发语言

我们看第一行,class 哺乳动物() :这句定义了一个叫哺乳动物的类。这个结构很像我们之前定义函数的def语句,不同的是定义类使用的关键字是class。而在这个括号里填的可不是参数,填什么我们后边再说。

再看第二行,似乎我们在定义一个函数。在类里也可以定义函数吗?当然!而且在类里定义的函数还有个更好理解的名字,叫方法。所以我们现在是在定义一个方法。

那def后跟的__init__是什么意思呢?使我们自己起的炫酷的方法名吗?不是的,可以看到语法高亮小秘书已经给它涂上了彰显尊贵的亮紫色,表明了它不平凡的血统。

Python in string找不到 python找不到对象_python_02

没错,__init__是一个内建函数,是initialize的缩写,意思是初始化。根据一个抽象的概念上的类创建一个具体的实在的对象,这个过程叫实例化,而在实例化的过程中,就会调用__init__函数。

看一下__init__后边的参数坑位,姓名、性别、年龄都是我们要定义的,没什么好说的。但这self是怎么回事?还被涂上了暗紫色?

还接着我们上一期的例子来看。我们要对大象分情况来管理,有一头大象叫刘老六,我们希望就这只具体的、特定的大象叫刘老六,性别公,年龄53,而不是所有的大象呼啦一下子都变成刘老六了。所以在实例化刘老六的时候,我们希望__init__函数作用到对象本身,所以在参数坑位首位的是代表实例本身的self。

那我们来看第三行及后边的代码:self.姓名 = 姓名,看到一个等号想到什么?赋值!而self.姓名,看到点,回想我们之前在第十期讲的,可以把点理解为什么?的!也就是说self.姓名相当于实例自己的姓名。

后边几行都一样,而自己的姓名、性别、年龄都被称为自己的属性,即对象属性。而在最后一行,我们调用一下自己的姓名属性来打印一行字。

但这还不算完,我们目前只定义了一个类,还没有用这个类去实例化一个对象:

Python in string找不到 python找不到对象_实例化_03

有同学提醒了:哎室长,self那个坑位没填!

这说明这位同学很仔细地学习了函数,但在这里self默认是对象自己,所以不需要填写self坑位。

我们来运行一下:

Python in string找不到 python找不到对象_字符串_04

可以看到,在我们实例化对象时,__init__函数就被执行了,除了在给刘老六的属性赋值,还打印出了一句话。

那我们如何知道刘老六的年龄呢?既然self.年龄是自己的年龄,那刘老六的年龄就是刘老六.年龄:

Python in string找不到 python找不到对象_实例化_05

Python in string找不到 python找不到对象_实例化_06

是不是非常清晰明了?

在哺乳动物之下,我们还要定义一个大象的子类,而定义的属性是哺乳动物不一定确定的(比如成年的年龄、要给它送的水果等),我们可以这样写:

Python in string找不到 python找不到对象_字符串_07

这里第一行 class 大象后边的括号我们填写了刚才定义的哺乳动物类。所以这个括号里应该填写的是这个类要继承的类(即父类)。

第二行没的说了,跟刚才一样。

第三行就比较有意思了,在大象这个类实例化时,先要调用父类哺乳动物的__init__函数。刘老六它首先是个哺乳动物,其次才是大象。如果我们要再写一个骆驼的类,同样也可以调用哺乳动物的__init__函数。有了这种继承方法,我们就不用一遍一遍地重复写了。

第四行定义一个成年年龄的属性,方便我们后边判断动物是否成年。

后边的就没有什么问题了,如果看不懂可以重新看一看第七期关于if语句的介绍。

我们来运行一下:

Python in string找不到 python找不到对象_Python in string找不到_08

Python in string找不到 python找不到对象_实例化_09

没有问题,是我们想要的结果。

那我们继续,这下我们可以走完装大象的过程了。

因为对于动物园来说,我们不管是装大象还是装骆驼还是以后装个老虎狮子,流程都是一样的,只不过一些判据、给的东西不一样,所以我们可以把装动物的方法写到哺乳动物类里:

Python in string找不到 python找不到对象_python_10

我们先写了一个确定容器的函数,函数的参数坑位只有一个self,因为这个函数里所有需要用到的属性都是对象自身的属性,所以只写一个self就够用了。

另外很多属性明明是我们在大象这个子类里定义的,在哺乳动物这个父类里也能调用吗?答案是可以的,因为在调用这个函数之前我们已经对大象的对象进行了初始化,它所调用的属性就有了值。

函数的内容其实和我们上一期写的伪代码差不多,这里就不再展开了。我们调用一下刘老六的全流程方法:

Python in string找不到 python找不到对象_开发语言_11

我们在第十二期的末尾遇到了这种用法(file.split()),当时的file是文件名的字符串。想到什么了吗?

字符串也是对象!我们从一开始就在使用对象了!而且不光是字符串,在Python里,万物皆是对象,格局一下子就大了有木有!

Python in string找不到 python找不到对象_python_12

但我们今天不做进一步的阐释了,只要知道在第十二期我们是在使用字符串的方法就可以了。

回来继续运行程序:

Python in string找不到 python找不到对象_Python in string找不到_13

完美!

我们再搞一只大象:

Python in string找不到 python找不到对象_python_14

Python in string找不到 python找不到对象_实例化_15

判断得非常准确!

那我们再去搞骆驼,一下子就变得简单了,只要写一个骆驼的类就可以:

Python in string找不到 python找不到对象_python_16

Python in string找不到 python找不到对象_开发语言_17

是不是非常简单省事!

可以想见,用不了多少代码,我们就可以把整个动物园的动物都安排上。

这一期我们了解了如何动手去写一个类,如何从类去实例化一个对象,如何调用对象的属性和方法,如何实现类的继承。这些内容可以让我们的代码变得更加简洁,让我们能够以更懒的方式去完成任务。

但我们还是有一些任务目标没有达到,比如动物园的冰柜不够用的这种情况。不管是冰柜还是冰箱微波炉,都应属于整个动物园共用的设备。那么对于类来说,有没有这样一个共用的量呢?