以下是我对Python3面向对象------继承的理解,因为博主也是初学Python3,有很多东西都还停留在表层的理解,如果我的博客有任何错误,请及时评论或者私信我,我会及时更改。也欢迎同样学习Python的你愿意关注我的博客,我会把我每周的学习内容进行整理和上传,方便大家沟通和交流学习经验。
Python3面向对象--------继承:
(1)继承与多重继承
继承:
通俗理解 子承父业
好处:
减少代码量,父类写了子类就不用再写,继承以后子类就拥有了父类所有的功能
多重继承:
那么子类功能多还是父类功能多呢?
答案肯定是子类
什么情况下使用继承:
当多个类出现相同代码的时候可以抽出一个父类(但是最好满足通俗的谁是谁的关系,)
一个类默认继承的是object(),object()可以说是所有类的祖宗了。
多重继承:
1.在继承中允许出现儿子-父亲-爷爷这种关系,
如果出现这种间接继承关系的时候我们一般叫做多重继承
2.python支持多继承
3.一个子类可以继承多个父类,(自然也就获得了多个父类所有的属性)
4.父类与父类之间用逗号隔开
5.如果括号内父类中出现相同名字的函数,就执行就近原则,哪个父类在前,先执行谁的构造函数
class Father1:
def playMajiang(self):
print("打麻将")
def eat(self):
print("吃饭1")
class Father2:
def playCard(self):
print("斗地主")
def eat(self):
print("吃饭2")
class son(Father2,Father1):
pass
s=son()
s.playMajiang()
s.playCard()
s.eat()
执行结果:打麻将
斗地主
吃饭2
上边的代码就展现了多重继承,当Father2和Father1中具有相同的函数名时,根据括号内父类的先后,执行最前面的。
(2)继承构造函数的问题
1.类中的构造函数不能继承(def __init__(self):)
2.如果创建子类时写了构造函数会覆盖了父类的构造函数
3. 如果在子类中要使用父类的变量,必须先手动调用父类 super().__init__(self)
4.调用父类构造时,最好把调用语句放在最前面,让父类构造先执行
5.子类构造有参数时,父类最好也有。
6.继承最好少用,因为程序一般遵循高内聚低耦合的形式就是说类与类之间最好不产生联系,
如果类与类之间联系过多,会极大限制程序的扩展性
下边看个案例:
案例效果:
姓名:王飞 年龄:30 性别:男 工龄:5年
我承诺我会认真教课
王飞爱玩象棋
姓名:小明 年龄:15 性别:男 学号:0023102
我承诺我会好好学习
小明爱踢足球
案例分析:
1. 从案例效果分析有老师和学生2个事物,老师里面有姓名、年龄、性别、工龄几个变量。
2. 学生里面有姓名、年龄、性别、学号几个变量。
3. 老师里面有讲课、玩和显示信息的show方法。
4. 学生里面有学习、玩和显示信息的show方法
5. 分析老师和学生里面公有的东西抽象出一个父类出来,将公有的东西写在父类中
6. 在主函数中创建一个老师和一个学生并完成赋值。
先创建类,并找出类中相同的属性抽出一个父类:
#先找出两者共同的属性,抽象出父类,写出父类的构造函数
class Father:
def __init__(self,name,age,sex,favorite,promise):
self.name = name
self.age = age
self.sex = sex
self.favorite = favorite
self.promise = promise
#创建教师类 注意构造函数参数的传递
class Teather(Father):
def __init__(self,name,age,sex,favorite,promise,gl):
super().__init__(name,age,sex,favorite,promise)
self.gl = gl
def show(self):
print('姓名:{},年龄:{},性别:{},工龄:{}'.format(self.name,self.age,self.sex,self.gl))
print('我承诺,我会好好{}'.format(self.promise))
print('{}爱玩{}'.format(self.name,self.favorite))
#创建学生类 注意构造函数参数的传递
class Student(Father):
def __init__(self,name,age,sex,favorite,promise,xh):
super().__init__(name,age,sex,favorite,promise)
self.xh = xh
def show(self):
print('姓名:{},年龄:{},性别:{},学号:{}'.format(self.name,self.age,self.sex,self.xh))
print('我承诺,我会好好{}'.format(self.promise))
print('{}爱玩{}'.format(self.name,self.favorite))
创建好之后,创建相应的对象
t1 = Teather('王飞',30,'男','象棋','教课',5)
t1.show()
s1 = Student('小米',18,'男','足球','读书',1501010088)
s1.show()
做完这个案例之后,我们应该对Python3中继承的相关知识有了一部分了解,拿到题之后,先分析题目有几个类,类中对象有什么属性和行为,如果类中有相同的属性和行为就可以抽出一个父类,从而减少了代码量,在子类中使用父类变量时,一定要记得先调用父类,调用方法是super().__init__(),要把调用放在最前面的位置,类中不同的属性和行为,可以在各自类中的构造函数中创建相应变量。