零基础 学 python开发 (Genius套餐A) 三十

版权声明:Genius https://blog.csdn.net/weixin_41987706/article/details/90167878

夜光序言:

 

 

 

 

你只道我放手放得潇洒,却不知这潇洒背后多少心酸苦楚。

 

正文:

5.4 类的继承 
 
5.4.1 目标


面向对象的一个很大的特点是类可以被扩展和继承,例如要编写学生类 Student 包含name、gender、age 和专业 major、系别 dept 等属性,就没有必要从头开始,只要从 Person类派生出 Student,在派生的过程中增加 major、dept 属性即可。教学目标是掌握派生与继承的方法,从 Person 类派生出 Student 类。


5.4.2 派生与继承 
1、派生与继承 


定义一个学生类 Student,包含姓名 name,性别 gender,年龄 age,还包含所学专业 major,所在系别 dept,那么就不必要重新定义 Student 类,只要从已经定义的 Person 类派生与继承过来就是了。
 


例 5-4-1:派生于继承 


 

class Person:
 def __init__(self,name,gender,age):
 self.name=name
 self.gender=gender
 self.age=age
 def show(self,end='\n'):
 print(self.name,self.gender,self.age,end=end)
class Student(Person):
 def __init__(self,name,gender,age,major,dept):
 Person.__init__(self,name,gender,age)
 self.major=major
 self.dept=dept
 def show(self):
 Person.show(self,' ')
 print(self.major,self.dept)
s=Student("james","male",20,"software","computer")
s.show()


结果:
james male 20 software computer
我们首先定义一个 Person 类包含有 name,gender,age 属性,派生出 Student 类(或者称Student 从 Person 继 承 ), 增 加 major 与 dept 属 性 , 这 样 Student 就具有name,gender,age,major,dept 全部属性了。Person 称为 Student 的基类,Student 称为 Person的派生类,Person 派生出 Student,Student 继承自 Person。


2、继承类构造函数 
从上面的 Student 类的定义可以看出派生类的构造函数除了要完成自己的新增加的major,dept 属性的初始化外,还要调用基类 Person 的构造函数,而且还要显示调用,即:
Person.__init__(self,name,gender,age)
通过类名称 Person 直接调用 Person 的__init__函数,并提供所要的 4 个参数。继承类是不会自动调用基类的构造函数的,必须显示调用。



3、属性方法的继承 


如果一个基类中有一个实例方法,在继承类中也可以重新定义完全一样的实例方法,例如 Person 有 show 方法,在 Student 中也有一样的 show 方法,它们是不会混淆的,我们称Student 类的 show 重写了 Person 的 show。当然一个基类的实例方法也可以不被重写,派生类会继承这个基类的实例方法,派生类也可以增加自己的新实例方法。
 



例 5-4-2:属性方法继承 


class Person:
 def __init__(self,name,gender,age):
 self.name=name
 self.gender=gender
 self.age=age
 def show(self,end='\n'):
 print(self.name,self.gender,self.age,end=end)
 def display(self,end='\n'):
 print(self.name,self.gender,self.age,end=end)
class Student(Person):
 def __init__(self,name,gender,age,major,dept):
 Person.__init__(self,name,gender,age)
 self.major=major
 self.dept=dept
 def show(self):
 Person.show(self,' ')
 print(self.major,self.dept)
 def setName(self,name):
 self.name=name
s=Student("james","male",20,"software","computer")
s.show()
s.display()
s.setName("robert")
s.show()
s.display()


结果:
james male 20 software computer
james male 20
robert male 20 software computer
robert male 20
其中 Person 中的 display 方法没有被 Student 重写,但是被 Student 继承,因此可以使用Student 的实例对象 s 调用:s.diaplay()
而 setName 方法是派生类 Student 新增加的实例方法,不是 Person 原来的方法。


5.4.3 【案例】我的日期时间类 MyDateTime 


1、案例描述 
我们已经编写过 MyDate 的日期类,再增加时分秒的数据,派生出日期时间类
MyDateTime。
 
2、案例分析 
class MyDate:
 def __init__(self,y,m,d):
 ......
class MyDateTime(MyDate):
 def __init__(self,y,mo,d,h,mi,s):
 ......
 
3、案例代码 


 

class MyDate:
 __months=[0,31,28,31,30,31,30,31,31,30,31,30,31]
 def __init__(self,y,m,d):
 if y<0:
 raise Exception("无效年份")
 if m<1 or m>12:
 raise Exception("无效月份")
 if y%400==0 or y%4==0 and y%100!=0:
 MyDate.__months[2]=29
 else:
 MyDate.__months[2]=28
 if d<1 or d>MyDate.__months[m]:
 raise Exception("无效日期")
 self.year=y
 self.month=m
 self.day=d
 def show(self,end='\n'):
 print("%04d-%02d-%02d" %(self.year,self.month,self.day),end=end)
class MyDateTime(MyDate):
 def __init__(self,y,mo,d,h,mi,s):
 MyDate.__init__(self,y,mo,d)
 if h<0 or h>23 or mi<0 or mi>59 or s<0 or s>59:
 raise Exception("无效时间")
 self.hour=h
 self.minute=mi
 self.second=s
 def show(self):
 MyDate.show(self,end=" ")
 print("%02d:%02d:%02d" %(self.hour,self.minute,self.second))
try:
 d=MyDateTime(2019,7,8,23,12,34)
 d.show()
except Exception as e:
 print(e)
结果:
2019-07-08 23:12:34

猜你喜欢

转载自blog.csdn.net/weixin_41987706/article/details/90167878