Python物件導向編程(一)

來源:互聯網
上載者:User

標籤:www   意思   引用   物件導向編程   tin   __weak   函數名   init   mod   

1.什麼是物件導向

物件導向(oop)是一種抽象的方法來理解這個世界,世間萬物都可以抽象成一個對象,一切事物都是由對象構成的。應用在編程中,是一種開發程式的方法,它將對象作為程式的基本單元。

2.物件導向與面向過程的區別

我們之前已經介紹過面向過程了http://www.cnblogs.com/zhang-can/p/7050182.html,面向過程的核心在‘過程’二字,過程就是解決問題的步驟,面向過程的方法設計程式就像是在設計一條流水線,是一種機械式的思維方式

  優點:複雜的問題簡單化,流程化

  缺點:擴充性差

  主要應用情境有:Linux核心,git,以及http服務

物件導向的程式設計,核心是對象,對象就是特徵(變數)與技能(函數)的結合體。

  優點:解決了程式擴充性差的問題

  缺點:可控性差,無法預測最終結果

  主要應用情境是需求經常變化的軟體,即與使用者互動比較頻繁的軟體

需要注意的是:物件導向的程式設計並不能解決全部問題,只是用來解決擴充性。當然,現在的的互連網軟體,擴充性是最重要的

3.對象與類的概念

在python中,一切皆對象,一個對象應該具有自己的屬性,也就是特徵,還有有自己的功能,即方法

在Python中,特徵用變數表示,功能用函數表示,所以對象就是變數與函數的結合體

而從各種各樣的對象中抽取出來具有相同特徵和相同功能組成的,就是類,所以說類是一系列對象共同特徵與功能的結合體

下面讓我們來定義一個類,方法與定義一個函數有些類似:

#定義一個中國人的類class Chinese:    #共同的特徵    country=‘China‘        #共同的技能    def talk(self):        print(‘is talking Chinese‘)    def eat(self):        print(‘is eating Chinese food‘)

這樣我們就定義好了一個類,注意:1.定義類用class關鍵字

                2.類名一般首字母大寫,且冒號前面不需要括弧,區別於函數定義
                3.與函數不同,類在定義階段就會執行類裡面的代碼

                4.類有兩種屬性,共同的特徵叫資料屬性,共同的功能叫函數屬性

怎樣由這個類產生一個對象呢?執行個體化:

#執行個體化的方式產生一個對象p1=Chinese()
p2=Chinese()

我們可以得出結論了,不管現實世界中怎麼樣,但是在程式中,確實是先有類,才有的對象

我們已經通過執行個體化的方式得到兩個對象了,但是有一個問題,得到的兩個對象,特徵和功能都是一樣的,這根萬物皆對象的理念完全不符啊,應該是每個對象都是不同的,這樣的世界才有意思啊

事實上,我們在定義類的時候,忘記了定義 __init__() 這個函數,正確的定義方法應該是這樣的:

#定義一個中國人的類class Chinese:    #共同的特徵    country=‘China‘    #初始化    def __init__(self,name,age):        self.name=name  #每個對象都有自己的名字        self.age=age    #每個對象都有自己的年齡    #共同的技能    def talk(self):        print(‘is talking Chinese‘)    def eat(self):        print(‘is eating Chinese food‘)#執行個體化的方式產生一個對象p1=Chinese(‘zhang‘,18)

類名加括弧就是執行個體化,執行個體化就會自動觸發__init__ 函數運行,可以用它來為每個對象定製自己的特徵

我們在定義__init__函數的時候,括弧裡有三個參數,但是我們執行個體化調用的時候卻只傳了兩個值,為什麼不報錯呢?這是因為self的作用就是:執行個體化的時候,自動將對象本身傳給__init__函數的第一個參數,當然self只是個名字了,egon老師說瞎幾把寫別人就看不懂了。

注意。這種自動傳值的機制只是在執行個體化的時候才會體現,類除了執行個體化還有一種作用就是屬性引用,方法是類名.屬性

#引用類的資料屬性print(Chinese.country)  #China#引用類的函數屬性# Chinese.talk()#TypeError: talk() missing 1 required positional argument: ‘self‘print(Chinese.talk) #<function Chinese.talk at 0x000001BC5F13D1E0>Chinese.talk(‘self‘)    #is talking Chinese#增加屬性Chinese.color=‘yellow‘#刪除屬性del Chinese.color

從上面報錯的代碼可以看出,屬性引用的時候,沒有自動傳值這回事

我們學過名稱空間的概念,定義一個變數,或者定義一個函數都會在記憶體中開闢一塊記憶體空間,類裡面也有定義變數(資料屬性),定義函數(函數屬性),他們也有名稱空間,可以通過.__dict__的方法查看

p1=Chinese(‘zhang‘,18)print(Chinese.__dict__)#{‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘__init__‘: <function Chinese.__# init__ at 0x000002187F35D158>, ‘talk‘: <function Chinese.talk at 0x000002187F35D1E0>, # ‘eat‘: <function Chinese.eat at 0x000002187F35D268>, ‘__# dict__‘: <attribute ‘__dict__‘ of ‘Chinese‘ objects>,#  ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Chinese‘ objects>, ‘__doc__‘: None}print(p1.__dict__)#{‘name‘: ‘zhang‘, ‘age‘: 18}

通過上面代碼顯示的結果我們知道了,列印執行個體化後的對象的名稱空間,只顯示自己特有的屬性,如果想要找到和其他對象共有的屬性,就要去類的名稱空間裡面去找

還有一個問題,對象的名稱空間中沒有函數屬性,當然也是去類裡面找,但是不同對象指定的函數,是一個函數嗎

p1=Chinese(‘zhang‘,18)p2=Chinese(‘li‘,19)print(Chinese.talk)#<function Chinese.talk at 0x000001B8A5B7D1E0>print(p1.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BD68>>print(p2.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BDA0>>

可以看到,並不是,他們的記憶體位址都不一樣。而且注意bound method,是Binder 方法

對象本身只有資料屬性,但是Python的class機制將類的函數也綁定到對象上,稱為對象的方法,或者叫Binder 方法。Binder 方法唯一綁定一個對象,同一個類的方法綁定到不同的對象上,屬於不同的方法。我們可以驗證一下:

當用到這個函數時:類調用的是函數屬性,既然是函數,就是函數名加括弧,有參數傳參數

而對象用到這個函數時,對象沒有函數屬性,他是Binder 方法,Binder 方法怎麼用呢,也是直接加括弧,但不同的是,Binder 方法會預設把對象自己作為第一個參數

class Chinese:    country=‘China‘    def __init__(self,name,age):        self.name=name          self.age=age        def talk(self):        print(‘%s is talking Chinese‘%self.name)    def eat(self):        print(‘is eating Chinese food‘)p1=Chinese(‘zhang‘,18)p2=Chinese(‘li‘,19)Chinese.talk(p1)    #zhang is talking Chinesep1.talk()           #zhang is talking Chinese

只要是Binder 方法,就會自動傳值!其實我們以前就接觸過這個,在python3中,類型就是類。資料類型如list,tuple,set,dict這些,實際上也都是類,我們以前用的方法如l1.append(3),還可以這樣寫:l1.append(l1,3)

未完待續。。。

Python物件導向編程(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.