Python基礎day-18[面向對象:繼承,組合,接口歸一化]
阿新 • • 發佈:2017-07-03
ini 關系 acl 報錯 子類 wan 使用 pytho 減少
繼承:
在Python3中默認繼承object類。但凡是繼承了object類以及子類的類稱為新式類(Python3中全是這個)。沒有繼承的稱為經典類(在Python2中沒有繼承object以及他的子類都是經典類。)
繼承是類與類的關系,解決了代碼重用的問題,減少冗余代碼。在Python中是先定義父類,然後在定義子類。最後使用 子類來實例化對象。
"繼承是一種什麽是什麽的關系。例如:下面的s1是obj的子類。"
#父類的定義:
class obj: #定義一個obj類 pass class s1(obj): #定義s1類,括號內填上其父類,多個父類使用逗號隔開。 pass print(obj.__bases__) #查看其繼承關系 print(s1.__bases__) 執行結果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py (<class ‘object‘>,) #默認繼承object類 (<class ‘__main__.obj‘>,) #繼承的 obj類 Process finished with exit code 0
當對象引用了一個屬性,但是類中沒有的話就會去類的父類中查詢,沒有在繼續向上查詢。
class obj: a = ‘abc‘ #父類中有一個變量 "a = ‘abc‘" class s1(obj): pass p1 = s1() #使用子類實例化一個對象print(p1.a) #查看對象p1的屬性a信息 執行結果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py abc #顯示的是父類的屬性信息 Process finished with exit code 0
派生:
指子類除從父類繼承的屬性,自己獨有的屬性。
class obj_1: def __init__(self, name, age, sex): #父類中共有的屬性 self.name = name self.age = age self.sex= sex class obj_2(obj_1): school = ‘Oldboy‘ #<------:這也是子類自己獨有的 def __init__(self, name, age, sex, salary): obj_1.__init__(self, name, age, sex) #傳值給父類 self.salary = salary #自己獨有的屬性 class stu(obj_1): job = ‘student‘ zhang = obj_2(‘zhang‘, 88, ‘nan‘, 5000) #實例化對象 wang = stu(‘wang‘, 55,‘nan‘) print(wang.name, wang.age, wang.job) print(zhang.name, zhang.age, zhang.sex, zhang.salary, zhang.school) 執行結果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/1.py wang 55 student zhang 88 nan 5000 Oldboy Process finished with exit code 0
組合:
"組合是一種 什麽有什麽的關系"
也是用於減少重復代碼。
class obj_1: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class obj_2(obj_1): school = ‘Oldboy‘ def __init__(self, name, age, sex, salary,year,mon,day): obj_1.__init__(self, name, age, sex) self.salary = salary self.birth = Date(year,mon,day) #boj_1子類有個 Date <-----此處調用date類 class stu(obj_1): job = ‘student‘ class Date: #定義 Date類 def __init__(self,year,mon,day): self.year = year self.mon = mon self.day = day def tell_birth(self): print(‘%s%s%s‘%(self.year,self.mon,self.day)) zhang = obj_2(‘zhang‘, 88, ‘nan‘, 5000,1994,11,32) wang = stu(‘wang‘, 55,‘nan‘) print(wang.name, wang.age, wang.job) print(zhang.name, zhang.age, zhang.sex, zhang.salary, zhang.school,) zhang.birth.tell_birth() #查看信息 執行結果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/1.py wang 55 student zhang 88 nan 5000 Oldboy 19941132 #輸出信息 Process finished with exit code 0
接口化歸一設計:
限制子類一定要有父類的方法,子類實現的方法必須跟父類的方法名字一樣。
import abc #導入abc模塊 class obj(metaclass=abc.ABCMeta): #元類 @abc.abstractclassmethod @調用裝飾器,限制子類的方法名 def read(self): pass @abc.abstractclassmethod def write(self): pass class s1(obj): def read(self): #子類的方法名必須跟父類一致,否則報錯 print(‘is read‘) def write(self): print(‘is write‘) class s2(obj): def read(self): print(‘is read‘) def write(self): print(‘is write‘) p1=s1() p1.read() 執行結果: D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.py is read Process finished with exit code 0
Python基礎day-18[面向對象:繼承,組合,接口歸一化]