【2020-10-04】bug三连现场:使用python面向对象机制

    科技2022-07-15  114

    项目场景

    定义一个People类,类中有两个基本属性:姓名(name)、性别(sex),一个私有属性:年龄(age);类中有三个方法:一个构造函数,一个getInfo函数(输出基本信息)和一个 getAge函数(返回age的值) 然后定义一个Student类,继承People类,并添加grade这一基础属性,在getInfo方法中输出类中属性的全部信息。


    问题描述

    初始代码如下:

    class People: name='' sex='' __age=0 def __init__(self,n,s,a): self.name=n self.sex=s self.__age=a def getInfo(self): print("我的名字是{},性别{},年龄{}".format(self.name,self.sex,self.__age)) def getAge(self): return self.__age class Student(People): grade=0 def __init__(self,n,s,a,g): People(n,s,a) self.grade=g def getInfo(self): print("我的名字是{},性别{},年龄{},成绩是{}".format(self.name,self.sex,self.getAge(),self.grade)) if __name__ == '__main__': stu=Student('liMing','male',19,98) stu.getInfo()

    运行代码结果如下:


    原因分析

    age作为People类的私有属性,无法被子类直接访问。


    解决方案

    将Student类中getInfo函数的self.__age修改为self.getAge(),如下:

    def getInfo(self): print("我的名字是{},性别{},年龄{}".format(self.name,self.sex,self.getAge()))

    运行代码,结果如下:

    原因分析

    此时的输出并不是正确的,通过分析可以得出:name、sex和age的属性值并没有正确地传递到类的实例中。因此可以推断Student类的构造方法出了问题!!!

    解决方案

    将Student类的构造方法中的People(n,s,a)修改为People.init(n,s,a),即:

    def __init__(self,n,s,a,g): People.__init__(n,s,a) self.grade=g

    运行代码,结果如下:

    原因分析

    报错信息显示构造函数需要参数a的值。初始看到报错信息我也一头雾水,比对函数后,发现少了参数。

    解决方案

    将Student类的构造方法中的People.init(n,s,a)修改为People.init(self,n,s,a)。

    完整代码

    class People: name='' sex='' __age=0 def __init__(self,n,s,a): self.name=n self.sex=s self.__age=a def getInfo(self): print("我的名字是{},性别{},年龄{}".format(self.name,self.sex,self.__age)) def getAge(self): return self.__age class Student(People): grade=0 def __init__(self,n,s,a,g): People.__init__(self,n,s,a) self.grade=g def getInfo(self): print("我的名字是{},性别{},年龄{},成绩是{}".format(self.name,self.sex,self.getAge(),self.grade)) if __name__ == '__main__': stu=Student('liMing','male',19,98) stu.getInfo()

    运行结果:


    总结

    这个实例不得不让我承认我是一个bug圣手了。同时我更加明白了动手敲代码的重要性,有些理论知识比较简单,自以为自己懂了,但是一实践就发现漏洞百出。 所以还是要多实战!!!

    Processed: 0.008, SQL: 8