1. 程式人生 > >Python系統學習第十一課

Python系統學習第十一課

受保護的封裝 protected

  • 講物件成員進行一定級別的封裝,然後在類中或者子類中部可以進行訪問,但是在外部不可以
  • 封裝方法:在成員前新增一個下劃線就可以

公有的 public

  • 誰都可以用

繼承

  • 繼承就是一個類可以獲得另一個類的成員屬性和成員方法
  • 作用:減小程式碼,增加程式碼的複用功能(很值得琢磨,深功夫),同時可以設定類與類直接的關係
  • 繼承與被繼承的概念:
    • 被繼承的類叫父類或者基類
    • 用於繼承的類叫子類也叫派生類
    • 繼承與被繼承的關係一定存在一個is - a關係
#繼承的語法
#實際上在python中,任何類都有一個共同的父類叫object
class Person():
    name = "None"
    age = 0
    def sleep(self):
        print("i am sleeping")
        
class Teacher(Person):
    pass

A = Teacher()   #繼承了父類的所有屬性
print(A.name)
print(Teacher.name)
A.sleep()
    
None
None
i am sleeping

繼承的特徵

  • 所有的類都繼承自object類,所有的類都是object的子類
  • 子類一旦繼承父類就可以使用父類中除私有成員外的所有內容
  • 子類繼承父類以後並沒有將父類成員完全複製到子類中,而是通過引用關係訪問呼叫
  • 子類可以定義獨有的成員屬性和方法
  • 子類中定義的成員和父類成員如果相同,則優先使用子類成員
  • 子類如果想擴充父類的方法,可以在定義新方法的同時訪問父類成員來進行程式碼重用,可以使用 父類名.父類成員 的格式來呼叫父類成員,也可以使用super().父類成員的格式來呼叫
class Person():
    name = "None"
    _age = 0
    __addr = "zhangjiakou"
    def
sleep(self): print("i am sleeping") class Teacher(Person): teacherID = "33317S153643" def test(self): print("i am teacher") A = Teacher() #繼承了父類的所有屬性 print(A.name) #可以訪問 print(A._age) #可以訪問 #print(A.__addr) #不可訪問 print(A.teacherID) A.test()
None
0
33317S153643
i am teacher
class Person():
    name = "lizi"
class Teacher(Person):
    name = "llll"
    
A  = Teacher()
print(A.name)   #子類和父類重名使用就近原則
llll

繼承變數函式的查詢順序問題

  • 優先查詢自己的變數
  • 沒有則查詢父類
  • 建構函式如果本類中沒有定義,則自動查詢父類建構函式
  • 如果本類有定義,則不再繼續向上查詢

建構函式

  • 是一類特殊的函式,在類進行例項化之前進行呼叫
  • 如果定義了建構函式,則例項化時使用建構函式,不查詢父類建構函式
  • 如果沒定義,就查詢父類建構函式
  • 如果子類沒定義建構函式,則構造物件時引數就按照父類的建構函式的引數構造
class Dog():
    def __init__(self):   #建構函式,每次例項化的時候第一個被呼叫,因為主要工作是進行初始化,所以得名建構函式
        print("i am dog")
        
d = Dog()   #例項化的時候,括號內的引數需要和建構函式引數相匹配
        
i am dog
#繼承中的建構函式
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self):
        print("paxingdongwu")

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  #例項化的時候呼叫了Dog的建構函式,呼叫的是子類的建構函式,不是呼叫的弗雷德建構函式

class Cat(PaXingAnimal):
    pass
C = Cat()   #此時自動呼叫建構函式,子類沒有建構函式,就向上查詢,查詢父類的建構函式
i am dog
paxingdongwu
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self, name):     #此時有了引數,name
        print("paxingdongwu {0}".format(name))

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  

class Cat(PaXingAnimal):
    pass
C = Cat()   #由於Cat沒有建構函式,就向上查詢,因為PaXingAnimal的建構函式需要兩個引數,例項化的時候就給了一個,報錯
i am dog



---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-22-bd7db85ae48b> in <module>()
     15 class Cat(PaXingAnimal):
     16     pass
---> 17 C = Cat()   #由於Cat沒有建構函式,就向上查詢,因為PaXingAnimal的建構函式需要兩個引數,例項化的時候就給了一個,報錯


TypeError: __init__() missing 1 required positional argument: 'name'
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self, name):     #此時有了引數,name
        print("paxingdongwu {0}".format(name))

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  

class Cat(PaXingAnimal):
    pass
C = Cat("benben")    #此時可以執行通過
i am dog
paxingdongwu benben

super

  • 不是關鍵字,而是一個類
  • super和父類沒有任何實質性關係,但是通過super可以呼叫父類
  • super().類名