程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> python基礎篇【第七篇】面向對象(上)

python基礎篇【第七篇】面向對象(上)

編輯:Python

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

 




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved