提到面向對象,總是離不開幾個重要的術語:多態(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()