1. 程式人生 > >Python基礎day-18[面向對象:繼承,組合,接口歸一化]

Python基礎day-18[面向對象:繼承,組合,接口歸一化]

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[面向對象:繼承,組合,接口歸一化]