面向對象的三大特性:繼承,封裝,多態java
一、什麼是繼承?python
繼承是一種新建類的方式,在python中支持一個兒子繼承多個爹linux
新建的類稱爲子類或者派生類sql
類又能夠稱爲基類或者超類編程
子類會遺傳父類的屬性json
二、爲何要用繼承微信
減小代碼的冗餘app
三、怎麼用繼承函數
''' class ParentClass1: pass class ParentClass2: pass class Subclass1(ParentClass1): pass class Subclass2(ParentClass1,ParentClass2): pass # print(Subclass1.__bases__) print(Subclass2.__bases__) # 在python2中有經典類與新式類之分 # 在python3中全都爲新式類
尋找繼承關係學習
class OldboyPeople: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def f1(self): print('爹的f1') class OldboyTeacher(OldboyPeople): def change_score(self): print('teacher %s is changing score'%self.name) tea1=OldboyTeacher('egon',18,'male') print(tea1.__dict__) print(tea1.name) print(tea1.school) tea1.f1()
基於繼承再找屬性關係
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def f1(self): print('爹的f1') class OldboyTeacher(OldboyPeople): def change_score(self): print('teacher %s is changing score' %self.name) tea1 = OldboyTeacher('egon', 18, 'male') # print(tea1.__dict__) # print(tea1.name) # print(tea1.school) # print(tea1.change_score) # print(tea1.f1) class Foo: def f1(self): print('Foo.f1') def f2(self): #self=obj print('Foo.f2') self.f1() #obj.f1() class Bar(Foo): def f1(self): print('Bar.f1') obj=Bar() # print(obj.__dict__) obj.f2() #基於對象本身的,再去找類的
派生
子類定義本身新的屬性,若是與父類同名,以子類本身的爲準
# #派生:子類定義本身新的屬性,若是與父類同名,以子類本身的爲準 # class OldboyPeople: # school = 'oldboy' # # def __init__(self, name, age, sex): # self.name = name # self.age = age # self.sex = sex # # def f1(self): # print('爹的f1') # class OldboyTeacher(OldboyPeople): # def change_score(self): # print('teacher %s is changing score' %self.name) # # def f1(self): # print('兒子的f1') # # tea1 = OldboyTeacher('egon', 18, 'male') # tea1.f1() # class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def f1(self): print('爹的f1') class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level,salary): self.name=name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print('teacher %s is changing score' %self.name) def f1(self): print('兒子的f1') tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary) #繼承能夠繼承父類特有的屬性,派生是能夠定製屬於本身的東西
在子類派生出的新方法中重用父類功能方法
# 在子類派生出的新方法中重用父類的功能 #方式一:指名道姓地調用(其實與繼承沒有什麼關係的) # OldboyPeople.__init__(self,name, age, sex) # class OldboyPeople: # school = 'oldboy' # # def __init__(self, name, age, sex): # self.name = name # self.age = age # self.sex = sex # # def tell_info(self): # print(""" # ===========我的信息========== # 姓名:%s # 年齡:%s # 性別:%s # """ %(self.name,self.age,self.sex)) # # class OldboyTeacher(OldboyPeople): # # tea1,'egon', 18, 'male', 9, 3.1 # def __init__(self, name, age, sex, level, salary): # # self.name = name # # self.age = age # # self.sex = sex # OldboyPeople.__init__(self,name, age, sex) # # self.level = level # self.salary = salary # # def tell_info(self): # OldboyPeople.tell_info(self) # print(""" # 等級:%s # 薪資:%s # """ %(self.level,self.salary)) # # tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) # # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) # # tea1.tell_info() #方式二:super()調用(嚴格依賴於繼承) #super()的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性 #瞭解:在python2中,須要super(本身的類名,self) class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def tell_info(self): print(""" ===========我的信息========== 姓名:%s 年齡:%s 性別:%s """ %(self.name,self.age,self.sex)) class OldboyTeacher(OldboyPeople): # tea1,'egon', 18, 'male', 9, 3.1 def __init__(self, name, age, sex, level, salary): # OldboyPeople.__init__(self,name, age, sex) super(OldboyTeacher,self).__init__(name,age,sex) self.level = level self.salary = salary def tell_info(self): # OldboyPeople.tell_info(self) super().tell_info() print(""" 等級:%s 薪資:%s """ %(self.level,self.salary)) tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) tea1.tell_info()
經典類與新式類
# python2中分爲經典類與新式類 python3中只有新式類 ''' 一、新式類: 繼承object的類,以及該類的子類,都是新式類 在python3中,若是一個類沒有指定繼承的父類,默認就繼承object 因此說python3中全部的類都是新式類 二、經典類(只有在python2才區分經典類與新式類): 沒有繼承object的類,以及該類的子類,都是經典類 ''' # print(object) class Foo(object): pass class Bar(Foo): pass # print(Foo.__bases__) #這條指令可以查看繼承的父類 print(Bar.__bases__)
菱形繼承(瞭解爲主)
super()對象嚴格依賴mro列表
週末做業
1.類的屬性和對象的屬性有什麼區別?
2.面向過程編程與面向對象編程的區別與應用場景?
4.什麼是綁定到對象的方法,如何定義,如何調用,給誰用?有什麼特性
5.以下示例,請用面向對象的形式優化一下代碼
在沒有學習類這個概念時,數據與功能是分離的,以下
def exc1(host,port,db,charset): conn=connect(host,port,db,charset) conn.execute(sql) return xxx def exc2(host,port,db,charset,proc_name) conn=connect(host,port,db,charset) conn.call_proc(sql) return xxx # 每次調用都須要重複傳入一堆參數 exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;') exc2('127.0.0.1',3306,'db1','utf8','存儲過程的名字')
六、下面這段代碼的輸出結果將是什麼?請解釋。
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent.x, Child1.x, Child2.x) Child1.x = 2 print(Parent.x, Child1.x, Child2.x) Parent.x = 3 print(Parent.x, Child1.x, Child2.x)
七、定義學校類,實例化輸出:北京校區、上海校區兩個對象
校區獨有的特性有:
校區名=「xxx」
校區地址={'city':"所在市","district":"所在的區"}
多門課程=["xxx","yyy","zzz"]
多個班級名=["xxx","yyy","zzz"]
校區能夠:
一、建立班級
二、查看本校區開設的全部班級名
三、建立課程
四、查看本校區開設的全部課程名
八、定義出班級類,實例化出兩個班級對象
班級對象獨有的特性:
班級名="xxx"
所屬校區名="xxx"
多門課程名=["xxx","yyy","zzz"]
多個講師名=["xxx","xxx","xxx"]
班級能夠:
一、查看
十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象
老師對象獨有的特徵:
名字="xxx"
等級="xxx"、
老師能夠:
修改學生的成績
十二、用面向對象的形式編寫一個老師類,老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能
1三、按照定義老師的方式,再定義一個學生類
1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘
相關答案
""" 1.類的屬性和對象的屬性的區別: 對象只屬於本身 能夠經過 對象名.屬性名來調用對象的屬性 類能夠被該類全部的對象繼承,類能夠經過 類名.屬性名來調用對象的屬性 2.面向過程編程與面向對象編程的區別與應用場景? 面向過程: 考慮的是步驟,擴展性差 維護性差 可是化繁爲簡 應用場景是 對擴展性要求不高的程序 好比:腳本程序等 面向對象: 考慮的是對象,擴展性強,維護性強,可是複雜,不可預知結果 應用場景是 對擴展性要求高的程序 好比:qq 微信 遊戲等 3.什麼是綁定到對象的方法,、如何定義,如何調用,給誰用?有什麼特性 方法: 把對象和函數進行綁定 定義: 在類中定義函數 調用: 能夠用對象調用 也能夠用類調用 給對象用 特性: 在對象調用類中的方法時,默認會把對象傳入到方法中 用類名調用方法的話,則須要手動傳入對象 """ """ 五、以下示例, 請用面向對象的形式優化如下代碼# 在沒有學習類這個概念時,數據與功能是分離的, 以下 def exc1(host, port, db, charset,aaa): conn = connect(host, port, db, charset,aaa) conn.execute(sql) return xxx def exc2(host, port, db, charset, proc_name) conn = connect(host, port, db, charset) conn.call_proc(sql) return xxx exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;') exc2('127.0.0.1',3306,'db1','utf8','存儲過程的名字') """ # class Mysql: # host = '127.0.0.1' # port = 3306 # db = 'db1' # charset = 'utf8' # # def exc1(self,sql): # conn = connect(self.host,self.port,self.db,self.charset) # conn.execute(sql) # return True # # def exc2(self,host, port, db, charset, proc_name): # conn = connect(host, port, db, charset) # conn.call_proc(proc_name) # return True # # obj = Mysql() # obj.exc1('select * from tb1;') # obj.exc2('存儲過程的名稱') # 六、下面這段代碼的輸出結果將是什麼?請解釋 # class Parent(object): # x = 1 # # class Child1(Parent): # pass # # class Child2(Parent): # pass # # # print(Parent.x, Child1.x, Child2.x) # 1 1 1 # # 先找子類 子類中沒有沿着繼承關係往父類找 # # Child1.x = 2 # Child1.x有了本身的x屬性 優先訪問本身的 # print(Parent.x, Child1.x, Child2.x) # 1 2 1 # # Parent.x = 3 # 修改父類中的屬性 # print(Parent.x, Child1.x, Child2.x) # 3 2 3 # # 子類Child1已經有屬於本身的屬性,即 x = 2,不會在繼承父類的屬性 """ 七、定義學校類,實例化出:北京校區、上海校區兩個對象 校區獨有的特徵有: 校區名=「xxx」 校區地址={'city':"所在市",'district':'所在的區'} 多們課程名=['xxx','yyy','zzz'] 多個班級名=['xxx','yyy','zzz'] 校區能夠: 一、建立班級 二、查看本校區開設的全部班級名 三、建立課程 四、查看本校區開設的全部課程名 """ # class School: # def __init__(self, name, address, course, grade): # self.name = name # self.address = address # self.course = course # self.grade = grade # # def make_grade(self, grade_name): # self.grade.append(grade_name) # print('%s班開課啦' % grade_name) # # # def check_grade(self): # print(self.grade) # # def make_course(self, course_name): # self.course.append(course_name) # print('添加了%s課程' % course_name) # # def check_course(self): # print(self.course) # # bj = School('北京校區',{'city':'北京','district':'朝陽區'},['python','linux','go'],['python1期','linux1期','go1期']) # sh = School('上海校區',{'city':'上海','district':'浦東新區'},['python','linux','go'],['python1期','linux1期','go1期']) # # # bj.check_course() # bj.check_grade() # bj.make_grade('java1期') # bj.make_course('java') # # bj.check_course() # bj.check_grade() """ 八、定義出班級類,實例化出兩個班級對象 班級對象獨有的特徵: 班級名=‘xxx’ 所屬校區名=‘xxx’ 多門課程名=['xxx','yyy','zzz'] 多個講師名=['xxx','xxx','xxx'] 班級能夠: 一、查看本班全部的課程 二、查看本班的任課老師姓名 """ # class Grade: # def __init__(self,name,area_name,courses=[],teachers=[]): # self.name = name # self.area_name = area_name # self.courses = courses # self.teachers = teachers # # # def check_course(self): # print("%s班級 共開設%s個學科:" % (self.name,len(self.courses))) # print(self.courses) # # # def check_taacher(self): # print("%s班級 共有%s個任課老師:" % (self.name,len(self.teachers))) # print(self.teachers) # # py1 = Grade('python4期','上海校區',['python初級','python高級'],['egon','yang','zhang']) # py2 = Grade('python5期','上海校區',['python初級','python高級','python進階'],['egon','yang','ji']) # py1.check_course() # py1.check_taacher() """ 九、定義課程類,實例化出python、linux、go三門課程對象 課程對象獨有的特徵: 課程名=‘xxx’ 週期=‘3mons’ 價格=3000 課程對象能夠: 一、查看課程的詳細信息 """ # class Course: # def __init__(self,name,month,price): # self.name = name # self.month = month # self.price = price # # def check_grade(self): # print("名稱:%s 週期:%s 價格:%s" % (self.name,self.month,self.price)) # # c1 = Course('python','3mons',3000) # c2 = Course('linux','3mons',3400) # c3 = Course('go','3mons',3500) # # c1.check_grade() # c2.check_grade() # c3.check_grade() """ 十、定義學生類,實例化出張鐵蛋、王三炮兩名學生對象 學生對象獨有的特徵: 學號=10 名字=」xxx「 班級名=['xxx','yyy'] 分數=33 學生能夠: 一、選擇班級 三、註冊,將對象序列化到文件 """ import json # # # 要實現第一個要求 須要有一個班級李列表 # classes = ["python1期","go1期","python2期","java20期"] # class Student: # def __init__(self, number, name, grade,class_names=[]): # self.number = number # self.name = name # self.class_names = class_names # self.grade = grade # # #選課 # def chioce_class(self): # print("班級列表:") # for i in classes: # print(i) # res = input("請選擇班級:").strip() # if res in self.class_names: # print("你已加入該班級...") # elif res in classes: # self.class_names.append(res) # print("加入成功!") # else: # print("輸入不正確....") # # #序列化 # def save(self): # dic = {'number': self.number, 'name': self.name, 'class_name': self.class_names, 'grade': self.grade} # with open(self.name, 'wt', encoding='utf-8')as f: # json.dump(dic, f) # print('save successful') # # # # stu1 = Student(10, '張鐵蛋', 'a3') # stu2 = Student(10, '王三炮', 'a3') # # stu1.chioce_class() # stu1.save() """ 十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象 老師對象獨有的特徵: 名字=「xxx」 等級=「xxx」、 老師能夠: 一、修改學生的成績 """ # class Teacher(): # def __init__(self, name, level): # self.name = name # self.level = level # # #經過名字 反序列化獲得學生對象 修改完成後在寫入到文件 # def change(self, name, new_grade): # with open('%s' % name, 'rt', encoding='utf-8')as f: # dic = json.load(f) # dic['grade'] = new_grade # print(dic) # with open('%s' % name, 'wt', encoding='utf-8')as f: # json.dump(dic, f) # print("修改爲功!") # # # # # tea1 = Teacher('egon', '高級') # # tea2 = Teacher('lqz', '高級') # # tea3 = Teacher('alex', '高級') # # tea4 = Teacher('wxx', '高級') # # # tea1.change('張鐵蛋',90) """ 十二、用面向對象的形式編寫一個老師類, 老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能 一、生成老師惟一編號的功能,能夠用hashlib對當前時間加上老師的全部信息進行校驗獲得一個hash值來做爲老師的編號 def create_id(self): pass 二、獲取老師全部信息 def tell_info(self): pass 三、將老師對象序列化保存到文件裏,文件名即老師的編號,提示功能以下 def save(self): with open('老師的編號','wb') as f: pickle.dump(self,f) 四、從文件夾中取出存儲老師對象的文件,而後反序列化出老師對象,提示功能以下 def get_obj_by_id(id): return pickle.load(open(id,'rb')) """ from hashlib import md5 import pickle,time # # # class Teacher: # def __init__(self, name, gender, age, level, wages): # self.name = name # self.gender = gender # self.age = age # self.level = level # self.wages = wages # self.id = self.create_id() # # def create_id(self): # md = md5(str(time.time()).encode("utf-8")) # return md.hexdigest() # # def tell_info(self): # print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" % # (self.name,self.gender,self.age,self.level,self.wages,self.id)) # # def save(self): # with open(self.id, 'wb') as f: # pickle.dump(self, f) # # @staticmethod # def get_obj_by_id(id): # return pickle.load(open(id, 'rb')) # # #序列化 # # t = Teacher("blex","男",20,"高級",3) # # t.save() # # #反序列化 # t2 = Teacher.get_obj_by_id("59905193f41f1f658cd9f0c530a59ab7") # t2.tell_info() """ 1三、按照定義老師的方式,再定義一個學生類 """ # class Student: # def __init__(self, name, gender, age, level, wages): # self.name = name # self.gender = gender # self.age = age # self.level = level # self.wages = wages # self.id = self.create_id() # # def create_id(self): # md = md5(str(time.time()).encode("utf-8")) # return md.hexdigest() # # def tell_info(self): # print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" % # (self.name,self.gender,self.age,self.level,self.wages,self.id)) # # def save(self): # with open(self.id, 'wb') as f: # pickle.dump(self, f) # # @staticmethod # def get_obj_by_id(id): # return pickle.load(open(id, 'rb')) """ 1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘 """ # # from hashlib import md5 # import pickle,time class BaseClass: def __init__(self, name, gender, age, level, wages): self.name = name self.gender = gender self.age = age self.level = level self.wages = wages self.id = self.create_id() def create_id(self): md = md5(str(time.time()).encode("utf-8")) return md.hexdigest() def tell_info(self): print("姓名:%s,性別:%s,年齡:%s,級別:%s,工資:%s,id:%s" % (self.name,self.gender,self.age,self.level,self.wages,self.id)) def save(self): with open(self.id, 'wb') as f: pickle.dump(self, f) @staticmethod def get_obj_by_id(id): return pickle.load(open(id, 'rb')) class Teacher(BaseClass): pass class Student(BaseClass): pass # #序列化 # t = Teacher("blex","男",20,"高級",3) # t.save() # # #反序列化 t2 = Teacher.get_obj_by_id("ba0698c54af43dcbefbc42605902677a") t2.tell_info()
七、定義學校類,實例化出:北京校區、上海校區兩個對象 校區獨有的特徵有: 校區名=「xxx」 校區地址={'city':"所在市",'district':'所在的區'} 多們課程名=['xxx','yyy','zzz'] 多個班級名=['xxx','yyy','zzz'] 校區能夠: 一、建立班級 二、查看本校區開設的全部班級名 三、建立課程 四、查看本校區開設的全部課程名 八、定義出班級類,實例化出兩個班級對象 班級對象獨有的特徵: 班級名=‘xxx’ 所屬校區名=‘xxx’ 多門課程名=['xxx','yyy','zzz'] 多個講師名=['xxx','xxx','xxx'] 班級能夠: 一、查看本班全部的課程 二、查看本班的任課老師姓名 九、定義課程類,實例化出python、linux、go三門課程對象 課程對象獨有的特徵: 課程名=‘xxx’ 週期=‘3mons’ 價格=3000 課程對象能夠: 一、查看課程的詳細信息 十、定義學生類,實例化出張鐵蛋、王三炮兩名學生對象 學生對象獨有的特徵: 學號=10 名字=」xxx「 班級名=['xxx','yyy'] 分數=33 學生能夠: 一、選擇班級 三、註冊,將對象序列化到文件 十一、定義講師類,實例化出egon,lqz,alex,wxx四名老師對象 老師對象獨有的特徵: 名字=「xxx」 等級=「xxx」、 老師能夠: 一、修改學生的成績 十二、用面向對象的形式編寫一個老師類, 老師有特徵:編號、姓名、性別、年齡、等級、工資,老師類中有功能 一、生成老師惟一編號的功能,能夠用hashlib對當前時間加上老師的全部信息進行校驗獲得一個hash值來做爲老師的編號 def create_id(self): pass 二、獲取老師全部信息 def tell_info(self): pass 三、將老師對象序列化保存到文件裏,文件名即老師的編號,提示功能以下 def save(self): with open('老師的編號','wb') as f: pickle.dump(self,f) 四、從文件夾中取出存儲老師對象的文件,而後反序列化出老師對象,提示功能以下 def get_obj_by_id(self,id): return pickle.load(open(id,'rb')) 1三、按照定義老師的方式,再定義一個學生類 1四、抽象老師類與學生類獲得父類,用繼承的方式減小代碼冗餘