Python入門學習筆記————12(繼承,建構函式)
阿新 • • 發佈:2018-12-29
受保護的封裝 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可以呼叫到父類