提到面向對象,總是離不開幾個重要的術語:多態(Polymorphism),繼承(Inheritance)和封裝(Encapsulation)
定義一個類可以采用下面的方式來定義:
class className: #定義函數用def 定義類也是一樣需要class block
注意類名後面有個冒號,在block塊裡面就可以定義屬性和方法了。當一個類定義完之後,就產生了一個類對象。類對象支持兩種操作:引用和實例化。引用操作是通過類對象去調用類中的屬性或者方法,而實例化是產生出一個類對象的實例,稱作實例對象。比如定義了一個people類:
class people: name = 'jack' #定義了一個屬性 #定義了一個方法 def printName(self): #在類裡面定義一個函數稱之為方法。 print self.name
people類定義完成之後就產生了一個全局的類對象,可以通過類對象來訪問類中的屬性和方法了。進行實例化操作,p=people( ),這樣就產生了一個people的實例對象,此時也可以通過實例對象p來訪問屬性或者方法了(p.name) ;這裡面的p就為people 的對象
name是一個屬性,printName( )是一個方法,與某個對象進行綁定的函數稱作為方法。一般在類裡面定義的函數與類對象或者實例對象綁定了,所以稱作為方法;而在類外定義的函數一般沒有同對象進行綁定,就稱為函數。
在類中可以根據需要定義一些方法,定義方法采用def關鍵字,在類中定義的方法至少會有一個參數,,默認以名為'self'的變量作為該參數(用其他名稱也可以)在,而且需要作為第一個參數。下面看個例子:
class people: name = 'jack' age = 12 def getName(self): return self.name def getAge(self): return self.age p = people() print(p.getName(),p.getAge())
構造方法
在Python中有一些內置的方法,這些方法命名都有比較特殊的地方(其方法名以2個下劃線開始然後以2個下劃線結束)
__init__(self,....)在生成對象時調用,可以用來進行一些初始化操作,不需要顯示去調用,系統會默認去執行。構造方法支持重載,如果用戶自己沒有重新定義構造方法,系統就自動執行默認的構造方法。
class Vector: def __init__(self, a, b): self.a = a self.b = b
繼承:
面向對象中的繼承和現實生活中的繼承相同,即:子可以繼承父的內容。
# ---------------繼承----------------- class Animals: def chi(self): print(self.name + "\t吃") def he(self): print(self.name + "\t喝") def piao(self): print("嫖娼-1") class Uncle: def du(self): print("賭博") def piao(self): print("嫖娼-2") class Dog(Animals,Uncle): def __init__(self,name): self.name = name def jiao(self): print(self.name + "\t汪汪汪~") alex = Dog("李傑") alex.piao()
對於面向對象的繼承來說,其實就是將多個類共有的方法提取到父類中,子類僅需繼承父類而不必一一實現每個方法。
注:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。
多繼承:
Python的類可以繼承多個類,Java和C#中則只能繼承一個類
Python的類如果繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先和廣度優先
當類是經典類時,多繼承情況下,會按照深度優先方式查找
當類是新式類時,多繼承情況下,會按照廣度優先方式查找
經典類和新式類,從字面上可以看出一個老一個新,新的必然包含了跟多的功能,也是之後推薦的寫法,從寫法上區分的話,如果 當前類或者父類繼承了object類,那麼該類便是新式類,否則便是經典類。
#經典類<br>class D: def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麼有,則繼續去D類中找,如果D類中麼有,則繼續去C類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> D --> C # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar()
#新式類 class D(object): def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麼有,則繼續去C類中找,如果C類中麼有,則繼續去D類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> C --> D # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar()