Python中类的定义

在Python中,类的定义形式是这样:




python3 类继承 python类的继承举例_python3 类继承


Class 类名(继承的类):

代码块

首先是Class关键字,然后跟上要定义的类名,object代表继承关系,也就是指定该类继承的父类,参数是类名,如果不指定这个参数,则默认为object,所有的类最后都会继承它。

类创建好了,怎么用?

我们前面说过,把类看作是一个模板,如果只有模板而不使用它做些实际的东西就体现不出模板的作用。所以我们需要把这个类实例化一下:


python3 类继承 python类的继承举例_python3 类继承_02


首先创建一个类firstClass,然后这个类里面我定义了一个first方法,这个方法被调用后会返回一个'first'字符串。然后定义一个变量first指向firstClass类的实例,而这个firstClass本身是一个类。

这样可能会让你觉得有点绕,假设还是那个活字印刷的工匠,他现在做好了一些字的模板,并且用这些模板印刷了几篇文章。那么这个印刷好的文章就是他那些模板的实例,模板本身就是

比如他印刷了《岳阳楼记》《出师表》《兰亭集序》这三篇,那么如果按类的写法就是:


python3 类继承 python类的继承举例_实例化_03


(没错Python可以用中文做变量,但是不推荐,例子仅作演示)

这个类的写法其实和上面的那个一样,但是可能这个会更好理解一点。首先还是定义了yinshua这个类,里面写了三个方法代表不同的文章,然后把这个"印刷"的任务实际执行一下,也就是"作品"被印刷出来了,这个时候你其实已经得到了三篇文章,想要看哪一篇,就直接从"作品"里面"拿"就好了。

(如果第一个看不懂的话可以先看这个,然后回过头来再看一下第一个会比较容易理解)

__init__方法

有些时候我们希望在一个类中强制绑定某些属性,比如我们想给刚才的"印刷"类绑定一个印刷人姓名的属性:


python3 类继承 python类的继承举例_python实例_04


类中的方法第一个参数一定是self,指向实例自身。需要注意的是,__init__方法只要定义了就一定会执行,而且是先执行它,所以如果我们定义了__init__方法,而且参数不止self一个,那么在实例化的时候就需要给它传和init对应的参数,但self不用传,Python的解释器会默认把它传进去。

另外,在Python的类中创建、使用方法的规则和创建普通函数基本相同,只不过类中创建方法的第一个参数一定是self。

类的继承

不同的类之间可以相互继承,当一个类继承了另一个类之后,它就可以使用被继承类的所有公有方法。

这里用一个简单的图书管理程序做例子:


python3 类继承 python类的继承举例_私有方法_05


(仅作示例,无实际功能)

我们先分析一下想要得到的效果

1. 获取用户姓名,然后查询用户希望查询的图书名称

2. 判断图书状态

3. 分别组合姓名与图书信息之后返回

为了更清晰的表现出继承关系,这里我创建了两个类,分别是实际执行操作的Libary类和没有写功能但是继承了Libray的SearchBook类。

在Libary类中定义__init__方法,并且将用户的姓名及年龄作为参数传进去,这样在这个类中的其他方法就可以调用到两个属性。

然后将获取图书名称和图书状态的方法分别定义出来,并用f-string的方法把它们的参数以及初始化时定义的name属性拼接。

最后实例化SearchBook类,并传入用户名和年龄,分别调用bookName()和bookStatus()方法并传入参数,可以看到程序返回了拼接完成后的字符串。

注意,我们并没有实例化Libary类,程序却正常执行了,这是为什么?

因为SearchBook类虽然没有定义任何方法,但是它继承了Libary类,所以实例化SearchBook可以调用Libary的所有公有方法。

私有方法

为什么我一直在强调类继承时继承的是父类的所有公有方法,而不是全部方法?

因为类中的方法分为公有方法和私有方法两种,公有方法可以被子类调用,但是私有方法只能在当前类调用,就相当于你继承了首富的财产,你可以随便使用这些财产,但是你却不能用他的身份证一样。

回到刚才的那个图书馆里程序,我们现在希望管理员执行添加图书的操作,那么需求大概就是这样的:

1. 判断是不是管理员(设定状态码为1是,为其他值时报错)

2. 添加图书操作

但是这个判断是不是管理员的方法,为了安全起见我们只想在本类下使用,因此我们的代码可能会变成这样:


python3 类继承 python类的继承举例_父类_06


这里做了一点变化,在程序开头使用import引入了一个sys模块,关于模块我们后面会专门讲一下,这里大家只要明白程序中的sys.argv[]代表的是在程序执行之前指定的参数,从文件名开始,比如我这个文件叫做class.py,那么sys.argv[0]就是class.py。


python3 类继承 python类的继承举例_私有方法_07


这样看的话可能会比较直观一点。

先看一下__isadmin()这个方法,可以看到它在命名上就可其他方法不太一样,在方法名前使用"__"两个下划线做前缀代表该方法是个私有方法,只能在本类下使用,子类不可以调用这个方法。而这个方法需要账号很密码两个参数,同时还有一个status变量用来储存是否拥有管理员权限,默认为0即为不是管理员,然后判断用户输入的账号和密码是否和程序中记录的相匹配,如果匹配则将Status改为1并返回这个值。

接着是addBooks()方法,它需要一个图书名的参数。首先是接收来自__isadmin()的返回值,如果注意,用户名没有直接调用__isadmin()方法,而是通过addBook()调用了isadmin()判断用户的输入是否正确,如果正确才执行添加操作,如果不正确返回失败。

看起来还是有点绕,但是实际执行一下程序:


python3 类继承 python类的继承举例_父类_08


验证成功,在实际项目中会讲用户密码以及状态码存储到服务器,然后程序通过与服务器中的数据与用户输入数据对比再执行验证。


python3 类继承 python类的继承举例_python3 类继承_09


直接调用私有方法会报错。

子类中调用父类方法

有的时候可能子类继承了父类之后,想要在子类内调用父类的方法

这个时候就需要用到一个特殊的方法super()


python3 类继承 python类的继承举例_python实例_10


Super()是调用父类的一个方法,在这个例子中可以简单理解为它复制并调用了父类中的一个fun()方法。