浅析python类继承(一)
?
面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
繼承概念的實現方式主要有2類:實現繼承、接口繼承。
?
繼承:
1、繼承時,子類會自動調用父類的構造函數
2、多繼承:繼承的父類會由左向右,一次繼承構造第一個繼承的父類無構造函數,則會找下一個父類的構造函數,第一個繼承的父類有構造函數,那么在實例化子類時就要傳相應多的參數,需要多傳參數時,就需要重構父類
3、繼承類的構造方法:
? ? ? ? 經典類的寫法: 父類名稱.__init__(self,參數1,參數2,...)
? ? ? ? 新式類的寫法:super(子類,self).__init__(參數1,參數2,....)
4、方法:A類繼承B,A類和B類有相同方法時,優先使用A本類的,A類沒有時,才去父類B找,使用父類的
5、實例變量:A類繼承B,A類和B類有相同實例變量時,優先使用A本類的,A類沒有時,才去父類B找,使用父類的
6、類變量:A類繼承B,A類和B類有相同類變量時,優先使用A本類的,A類沒有時,才去父類B找,使用父類的
7、新式類按廣度優選繼承的,B、C分別繼承A,D繼承B、C 執行D,當D沒有構造方法找B,當B沒有找C,當C沒有找A
#單類繼承 class People(object):#新式類def __init__(self,name,age):self.name=nameself.age=agedef A(self):print("this is People類 A方法,姓名:%s,年齡:%s"%(self.name,self.age)) class Man(People):#繼承People類def A(self):print("this is Man類A方法,姓名:%s,年齡:%s"%(self.name,self.age))def B(self):print("this is Man類B方法繼承People類,姓名:%s,年齡:%s"%(self.name,self.age)) class Women(People):#繼承People類def __init__(self,name,age,money):#先繼承,再重構People.__init__(self,name,age)#繼承父類構造方法#super(Women,self).__init__(name,age)#方法2self.money=moneydef B(self):People.A(self)print("this is Women類A方法,姓名:%s,年齡:%s,薪資:%s" % (self.name, self.age,self.money)) p=People("wangli",7) p.A() print(p.name,p.age) m=Man("chengzi",11) m.A() m.B() print(m.name,m.age) w=Women("xixi",22,111111) w.B() print(w.name,w.age,w.money)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py this is People類 A方法,姓名:wangli,年齡:7 wangli 7 this is Man類A方法,姓名:chengzi,年齡:11 this is Man類B方法繼承People類,姓名:chengzi,年齡:11 chengzi 11 this is People類 A方法,姓名:xixi,年齡:22 this is Women類A方法,姓名:xixi,年齡:22,薪資:111111 xixi 22 111111Process finished with exit code 0?
#多重繼承例1:class Person(object):def __init__(self,name,sex):self.name = nameself.sex = sexdef print_title(self):if self.sex == "male":print("man")elif self.sex == "female":print("woman")class Child(Person):passclass Baby(Child):passMay = Baby("May","female") # 繼承上上層父類的屬性 print(May.name,May.sex) May.print_title() # 可使用上上層父類的方法class Child(Person): def print_title(self):if self.sex == "male":print("boy")elif self.sex == "female":print("girl")class Baby(Child):passMay = Baby("May","female") May.print_title() # 優先使用上層類的方法 #多重繼承例2: class People(object):#新式類name='我是父類變量'def __init__(self,name,age):self.name=nameself.age=agedef A(self):print("this is People類 A方法,姓名:%s,年齡:%s"%(self.name,self.age)) class Relaton(object):def make_friends(self,obj):print("%s is making friends with %s" % (self.name, obj.name)) class Man(People,Relaton):#多重繼承def A(self):print("this is Man類A方法,姓名:%s,年齡:%s"%(self.name,self.age))def B(self):print("this is Man類B方法繼承People類,姓名:%s,年齡:%s"%(self.name,self.age)) class Women(People,Relaton):#多重繼承name='我是Women類變量'def __init__(self,name,age,money):#先繼承,再重構People.__init__(self,name,age)#繼承父類構造方法self.money=moneydef B(self):People.A(self)print("this is Women類A方法,姓名:%s,年齡:%s,薪資:%s" % (self.name, self.age,self.money)) p=People("wangli",7) p.A() print(p.name,p.age) m=Man("chengzi",20) m.A() m.B() print(m.name,m.age) w=Women("xixi",22,10000) w.B() print(w.name) print(w.name,w.age,w.money) print(People.name,Women.name)m.make_friends(w)#多重繼承調用C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py this is People類 A方法,姓名:wangli,年齡:7 wangli 7 this is Man類A方法,姓名:chengzi,年齡:20 this is Man類B方法繼承People類,姓名:chengzi,年齡:20 chengzi 20 this is People類 A方法,姓名:xixi,年齡:22 this is Women類A方法,姓名:xixi,年齡:22,薪資:10000 xixi xixi 22 10000 我是父類變量 我是Women類變量 chengzi is making friends with xixiProcess finished with exit code 0 #多重繼承3新式類按廣度優先繼承構造函數的,B、C分別繼承A,D繼承B和C 實例化D,會調用執行構造函數,當D沒有構造方法找B,當B沒有找C,當C沒有找A --------------------------------------------------------- class A(object):pass class B(A):pass class C(A):pass class D(B,C):def __init__(self,name):self.name=nameprint('D類有構造函數優先調本來的【%s】'%self.name) d=D('橙子') #實例化會自動調構造函數C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py D類有構造函數優先調本來的【橙子】------------------------------------------------------- class A(object):pass class B(A):def __init__(self,name):self.name=nameprint('D類無構造函數,找B類構造函數優先調用【%s】'%self.name) class C(A):pass class D(B,C):pass d=D('橙子') #實例化會自動調構造函數C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py D類無構造函數,找B類構造函數優先調用【橙子】------------------------------------------------------------class A(object):pass class B(A):pass class C(A):def __init__(self,name):self.name=nameprint('D類、B類無構造函數,找C類構造函數優先調用【%s】'%self.name) class D(B,C):pass d=D('橙子') #實例化會自動調構造函數C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py D類、B類無構造函數,找C類構造函數優先調用【橙子】----------------------------------------------------------------- class A(object):def __init__(self,name):self.name=nameprint('D類、B類、C類無構造函數,找A類構造函數優先調用【%s】'%self.name) class B(A):pass class C(A):pass class D(B,C):pass d=D('橙子') #實例化會自動調構造函數C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py D類、B類、C類無構造函數,找A類構造函數優先調用【橙子】 ------------------------------------------------------------------- #繼承實例4 class School(object):#學校類def __init__(self,name,addr):self.name=nameself.addr=addrself.students=[]self.staffs=[]def enroll(self,stu_obj):print("為學員%s 辦理注冊手續"%stu_obj.name)self.students.append(stu_obj)def hire(self,staff_obj):self.staffs.append(staff_obj)print("雇用新員工%s"%staff_obj.name) class SchoolMember(object):def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef tesll(self):pass class Teacher(SchoolMember):def __init__(self,name,age,sex,salary,course):super(Teacher,self).__init__(name,age,sex)self.salary=salaryself.course=coursedef tell(self):print('''---- info of Teacher:%s ----Name:%sAge:%sSex:%sSalary:%sCourse:%s'''%(self.name,self.name,self.age,self.sex,self.salary,self.course))def teach(self):print("%s is teaching course [%s]"%(self.name,self.course)) class Student(SchoolMember):def __init__(self,name,age,sex,stu_id,grade):super(Student,self).__init__(name,age,sex)self.stu_id=stu_idself.grade=gradedef tell(self):print('''---- info of Student:%s ----Name:%sAge:%sSex:%sStu_id:%sGrade:%s'''% (self.name, self.name, self.age, self.sex, self.stu_id, self.grade))def pay_tuition(self,amount):print("%s has paid tution for $%s" % (self.name, amount)) school=School("橙子IT","陜西")#實例化t1=Teacher("王力",20,"M",200000,"Linux")#實例化 t2=Teacher("王荔",22,"F",3000,"PtrhonDevOps")#實例化s1 = Student("橙汁",36,"MF",1001,"PythonDevOps")#實例化 s2 = Student("橘子",19,"M",1002,"Linux")#實例化t1.tell() s1.tell() school.hire(t1) school.enroll(s1) school.enroll(s2) print(school.students) print(school.staffs) school.staffs[0].teach()#t1老師的實例.teach() for stu in school.students:#遍歷學生,調學生方法stu.pay_tuition(5000)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py ---- info of Teacher:王力 ----Name:王力Age:20Sex:MSalary:200000Course:Linux ---- info of Student:橙汁 ----Name:橙汁Age:36Sex:MFStu_id:1001Grade:PythonDevOps 雇用新員工王力 為學員橙汁 辦理注冊手續 為學員橘子 辦理注冊手續 [<__main__.Student object at 0x000001BDCB69BCC0>, <__main__.Student object at 0x000001BDCB69BCF8>] [<__main__.Teacher object at 0x000001BDCB69BC50>] 王力 is teaching course [Linux] 橙汁 has paid tution for $5000 橘子 has paid tution for $5000Process finished with exit code 0?
總結
以上是生活随笔為你收集整理的浅析python类继承(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】这些Python骚操作,
- 下一篇: 神秘的安全测试思考案例(一)