標籤:組合 裝飾器 屬性 class roc 類的屬性 object類 python2 nan
繼承:
在Python3中預設繼承object類。但凡是繼承了object類以及子類的類稱為新式類(Python3中全是這個)。沒有繼承的稱為經典類(在Python2中沒有繼承object以及他的子類都是經典類。)
繼承是類與類的關係,解決了代碼重用的問題,減少冗餘代碼。在Python中是先定義父類,然後在定義子類。最後使用 子類來執行個體化對象。
"繼承是一種什麼是什麼的關係。例如:下面的s1是obj的子類。"
#父類的定義:
class obj: #定義一個obj類 passclass s1(obj): #定義s1類,括弧內填上其父類,多個父類使用逗號隔開。 passprint(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): passp1 = s1() #使用子類執行個體化一個對象print(p1.a) #查看對象p1的屬性a資訊執行結果:D:\Python\Python36-32\python.exe E:/Python/DAY-18/tmp.pyabc #顯示的是父類的屬性資訊Process finished with exit code 0
派生:
指子類除從父類繼承的屬性,自己專屬的屬性。
class obj_1: def __init__(self, name, age, sex): #父類中共有的屬性 self.name = name self.age = age self.sex = sexclass 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.pywang 55 studentzhang 88 nan 5000 OldboyProcess finished with exit code 0
組合:
"組合是一種 什麼有什麼的關係"
也是用於減少重複代碼。
class obj_1: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sexclass 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.pywang 55 studentzhang 88 nan 5000 Oldboy19941132 #輸出資訊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): passclass 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.pyis readProcess finished with exit code 0
Python基礎day-18[物件導向:繼承,組合,介面歸一化]