Python系統學習第十一課
阿新 • • 發佈:2019-01-04
受保護的封裝 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().類名