1. 程式人生 > >Python入門學習筆記————12(繼承,建構函式)

Python入門學習筆記————12(繼承,建構函式)

受保護的封裝 protected

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

    公開的,公共的 public

  • 公共的封裝實際對成員沒有任何操作,任何地方都可以訪問

繼承

  • 繼承是一個類可以獲得另外一個類中的成員屬性和成員方法
  • 作用 : 減少程式碼,增加程式碼的複用功能,同時可以設定類與類的直接的關係
  • 繼承與被繼承的概念:
    • 被繼承的類,叫做父類,也叫作基類,也叫超類
    • 用於繼承的類,叫做子類,也叫派生類
    • 繼承與被繼承一定存在一個 is——a 關係
  • 繼承的語法
  • 繼承的特徵
    • 所有的類都繼承自object類,即所有類都是object的子類
    • 子類一旦繼承父類,則可以使用父類中除私有成員外的所有內容
    • 子類繼承父類後並沒有將父類成員完全賦值給子類中,而是通過引用關係訪問呼叫
    • 子類中可以定義獨有的成員屬性和方法
    • 子類中成員與父類中成員相同則優先使用子類
    • 子類如果想擴充父類方法,可以在定義新方法的同時訪問父類成員來進行程式碼重用,可以使用 父類名.父類成員 的格式來呼叫父類成員,也可以使用super().父類成員 的格式來呼叫
  • 繼承變數函式的查詢順序
    • 優先查詢自己的變數
    • 沒有則查詢父類
    • 建構函式如果本類中沒有定義,則自動查詢呼叫父類建構函式
    • 如果本類有定義,則不再向上查詢

In [1]:

 

# 繼承語法
#在Python中,任何一個類都有一個共同的類叫object
class Person():
    name = 'Noname'
    age = 12
    def sleep(self):
        print('sleeping...')
#父類寫在括號裡
class Teacher (Person):
    #子類中的獨有成員函式
    def make_test(self):
        pass
t = Teacher()
print(t.name)
print(Teacher.name)
 
Noname
Noname

In [7]:

 

class Person():
    name = 'Noname'
    age = 12
    __score = 100 #成績屬於私有成員,只能自己訪問
    _petname = 'goudan' #小名屬於受保護的,不能外部訪問
    def sleep(self):
        print('sleeping...')
#父類寫在括號裡
class Teacher (Person):
    #子類中的獨有成員函式
    def make_test(self):
        pass
t = Teacher()
print(t.name)
print(t._petname)
t.sleep()
print(t.__score) #私有無法訪問報錯
 
Noname
goudan
sleeping...
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-f6a778bb0e74> in <module>()
     16 print(t._petname)
     17 t.sleep()
---> 18 print(t.__score) #私有無法訪問報錯
     19 

AttributeError: 'Teacher' object has no attribute '__score'

In [11]:

 

#子類可以有自己的屬性與方法
class Person():
    name = 'Noname'
    age = 12
    def sleep(self):
        print('sleeping...')
#父類寫在括號裡
class Teacher (Person):
    #子類中的獨有成員函式
    teacher_id = 343
    def make_test(self):
        print('attention')
t = Teacher()
print(t.name)
print(t.teacher_id)
t.make_test()  #呼叫成員函式方法
 
Noname
343
attention

In [14]:

 

#子類與父類中變數名稱相同
class Person():
    name = 'Noname'
    age = 12
    def sleep(self):
        print('sleeping...')
#父類寫在括號裡
class Teacher (Person):
    #子類中的獨有成員函式
    name = 'goudan' #名稱相同
    def make_test(self):
        pass
t = Teacher()
print(t.name)
print(Person.name)
 
goudan
Noname

In [24]:

 

#子類擴充父類功能
class Person():
    name = 'Noname'
    age = 12
    def sleep(self):
        print('sleeping...')
 
    def work(self):
        print('make some money')
#父類寫在括號裡
class Teacher(Person):
    #子類中的獨有成員函式
    def make_test(self):
        print('attention')
    def work(self):
        #擴充父類功能只需要呼叫父類相應函式
        Person.work(self) # 還可以使用 super().work() 來得到目的,super() 即代表父類
        self.make_test()
t = Teacher()
t.work()
 
make some money
attention

建構函式

  • 是一類特殊的函式,在類例項化之前進行呼叫
  • 如果定義了建構函式,則例項化時使用建構函式,不查詢父類
  • 如果子類不帶,父類帶,則構造物件時的引數應該按父類引數構造

In [25]:

 

# 建構函式的概念
class Dog():
    #__init__就是建構函式,格式固定
    #每次例項化時第一個被自動呼叫
    #主要工作是進行初始化
    def __init__(self):#必須有引數
        print('I am init in dog')
#例項化時,括號內的引數需要跟建構函式引數匹配
kaka = Dog()
I am init in dog

In [26]:

 

 
#繼承中的建構函式 - 1
class Anim():
    pass
class PaxingAnim(Anim):
    pass
class Dog(PaxingAnim):
    def __init__(self):
        print('I am init in dog')
#例項化的時候,自動呼叫了Dog的建構函式
kaka = Dog()
I am init in dog

In [31]:

 

 
#繼承中的建構函式 - 2
class Anim():
    def __init__(self):
        print('dongwu')
class PaxingAnim(Anim):
    def __init__(self):
        print('wo kao pa')
class Dog(PaxingAnim):
    def __init__(self):
        print('I am init in dog')
#注意,在自身找到了建構函式,所以不在父類查詢
kaka = Dog ()
#沒有定義建構函式,則去父類中進行查詢,找到即停止
class Cat(PaxingAnim):
    pass
haha = Cat()
I am init in dog
wo kao pa

In [38]:

 

 
#繼承中的建構函式 - 3
class Anim():
    def __init__(self):
        print('dongwu')
class PaxingAnim(Anim):
    def __init__(self,name):#注意引數需要匹配
        print('wo kao pa {0}'.format(name))
class Dog(PaxingAnim):
    def __init__(self):
        print('I am init in dog')
#本身有建構函式企且匹配
d = Dog()
class Cat(PaxingAnim):
    pass
#引數匹配
name = 'gogo'
haha = Cat(name)
#引數不匹配,報錯
haha = Cat()
I am init in dog
wo kao pa gogo
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-017e2b6ebfdb> in <module>()
     19 haha = Cat(name)
     20 #引數不匹配,報錯
---> 21 haha = Cat()

TypeError: __init__() missing 1 required positional argument: 'name'

super

  • super不是關鍵字,而是一個類
  • super的作用是獲取MRO列表中的第一個類
  • super與父類沒有直接任何實質性3關係,但是通過super可以呼叫到父類