OOP
- 面向對象的編程
- 一切皆對象,每種對象都有一些相關的屬性
- 類class:它是一個藍圖,描述了某一對象有哪些屬性和行爲。
- 實例、對象:通過類創建具體的實例、對象。
- 方法:本質上是函數,定義在類中的函數叫方法。
- 類名建議採用駝峯的形式,也就是每個單詞首字母大寫,如MyClass
- 類中定義的方法需要綁定在具體的實例,由實例調用
class Role:
'類聲明'
def __init__(self, name, weapon):
'該方法被稱作構造器方法,用於將屬性綁定在實例身上'
# self不是關鍵字,可以是任意的合法名稱
self.name = name
self.weapon = weapon
def show_me(self):
# 綁定在實例身上的屬性,可以用在類中的任何地方
print('我是%s,我擅用%s' % (self.name, self.weapon))
if __name__ == '__main__':
# 根據類創建出具體的實例,自動調用__init__方法,實例將自動作爲第一個參數
lb = Role('呂布', '方天畫戟')
print(lb.name)
print(lb.weapon)
lb.show_me()
組合
- 類被定義後,目標就是要把它當成一個模塊來使用, 並把這些對象嵌入到你的代碼中去
- 組合就是讓不同的類混合並加入到其它類中來增加功能和代碼重用性
- 可以在一個大點的類中創建其它類的實例,實現一些其它屬性和方法來增強對原來的類對象
組合應用
- 兩個類明顯不同
- 一個類是另一個類的組件
class Role:
'類聲明'
def __init__(self, name, weapon):
'該方法被稱作構造器方法,用於將屬性綁定在實例身上'
# self不是關鍵字,可以是任意的合法名稱
self.name = name
self.weapon =weapon
def show_me(self):
# 綁定在實例身上的屬性,可以用在類中的任何地方
print('我是%s,我擅用%s' % (self.name, self.weapon.wname))
class Weapon:
def __init__(self, wname, strength):
self.wname = wname
self.strength = strengt
if __name__ == '__main__':
ji = Weapon('方天畫戟', 100)
lb = Role('呂布', ji)
print(lb.name)
print(lb.weapon.wname)
print(lb.weapon.strength)
lb.show_me()
繼承
- 繼承描述了基類的屬性如何“遺傳”給派生類
- 子類可以繼承它的基類的任何屬性,不管是數據屬性還是方法
子類:
- 當類之間有顯著的不同,並且較小的類是較大的類所需要的組件時組合表現得很好;但當設計“相同的類但有一些不同的功能”時,派生就是一個更加合理的選擇了
- OOP的更強大方面之一是能夠使用一個已經定義好的類,擴展它或者對其進行修改,而不會影響系統中使用現存類的其它代碼片段
- OOP(面向對象設計)允許類特徵在子孫類或子類中進行繼承
- 子類也可以定義自己的方法
- 創建子類只需要在括號中寫入父類名稱即可
通過繼承覆蓋方法
- 字類中有和父類同名的方法時,父類的方法將被覆蓋
class Role:
'類聲明'
def __init__(self, name, weapon):
'該方法被稱作構造器方法,用於將屬性綁定在實例身上'
# self不是關鍵字,可以是任意的合法名稱
self.name = name
self.weapon =weapon
def show_me(self):
# 綁定在實例身上的屬性,可以用在類中的任何地方
print('我是%s,我擅用%s' % (self.name, self.weapon.wname))
class Worrios(Role):
def __init__(self,name,weapon,health): #父類中的方法將被覆蓋
Role.__init__(self,name,weapon) #調用父類中的方法
Worrios.health = health
def attack(self, target):
print('近戰攻擊: %s' % target)
if __name__ == '__main__':
lb = Worrios('呂布', '矛', 200)
print('name: %s, wuqi: %s, HP: %s' % (lb.name, lb.weapon, lb.health))
lb.attack('dc')
多重繼承
- 一個類可以是多個類的子類,子類擁有所有父類的屬性
- 子類的實例查找方法時,順序爲從下到上,從左到右
class A:
def func1(self):
print('A func')
def func4(self):
print('A 4')
class B:
def func2(self):
print('B func')
def func4(self):
print('B 4')
class C(B, A): # B在左,優先B
def func3(self):
print('C func')
if __name__ == '__main__':
c1 = C()
c1.func1()
c1.func2()
c1.func3()
c1.func4() #此時該子類中沒有該方法,所以向上查找
特殊方法
-
在class中,有很多以雙下劃線開頭和結尾的方法,這些都是特殊方法,也被稱作
魔法方法magic。 -
常用特殊方法:
__init__
/__str__
/__call__
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def __str__(self):
return '《%s》' % self.title
def __call__(self):
print('《%s》是%s所著' % (self.title, self.author))
if __name__ == '__main__':
pybook = Book('Python教程第三版', 'Magnus Lie Hetland')
#在打印時,將自動調用__str__方法
print(pybook)
#使實例像函數一樣可以調用,調用__call__方法
pybook()