首頁  >  文章  >  後端開發  >  Python物件導向程式設計的詳細介紹

Python物件導向程式設計的詳細介紹

零下一度
零下一度原創
2017-07-03 09:41:371330瀏覽

1.什麼是物件導向

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

2.物件導向與過程導向的差異

我們之前已經介紹過面向過程了,過程導向的核心在'過程'二字,過程就是解決問題的步驟,面向過程的方法設計程式就像是在設計一條管線,是一種機械式的思考方式

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

  缺點:擴展性差

  主要應用場景有: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關鍵字

                           字母大寫,且冒號前面不需要括號,區別於函數定義
                                              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 &#39;__dict__&#39; of &#39;Chinese&#39; objects>,#  '__weakref__': <attribute &#39;__weakref__&#39; of &#39;Chinese&#39; 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,是绑定方法

对象本身只有数据属性,但是Python的class机制将类的函数也绑定到对象上,称为对象的方法,或者叫绑定方法。绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法。我们可以验证一下:

当用到这个函数时:类调用的是函数属性,既然是函数,就是函数名加括号,有参数传参数

而对象用到这个函数时,对象没有函数属性,他是绑定方法,绑定方法怎么用呢,也是直接加括号,但不同的是,绑定方法会默认把对象自己作为第一个参数

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

只要是绑定方法,就会自动传值!其实我们以前就接触过这个,在python3中,类型就是类。数据类型如list,tuple,set,dict这些,实际上也都是类,我们以前用的方法如l1.append(3),还可以这样写:l1.append(l1,3)

未完待续。。。

以上是Python物件導向程式設計的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn