Python學習筆記5——一切皆物件

Eternally_陪伴發表於2018-09-05

我發現我不適合看視訊學習,看書看文字覺得更舒服,看大神的部落格教程:Python快速教程——這是大神的第一篇部落格,點選下一篇,一篇篇看下去,都很通俗易懂,坐看看大神是如何成長的,可以利用碎片時間看,收穫很多,不再迷茫。

另外,下面的評論也很有乾貨,值得認真看看,也會有收穫。

需要注意的是,大神用的是Python2.x,而我用的是python3.6,部分程式碼可能會有區別,但思想是一脈相承的,這個有些評論裡有提到的。

主要通過這裡的部落格學習的:Python基礎08 物件導向的基本概念  以及 Python基礎09 物件導向的進一步擴充

Python使用類(class)和物件(object),進行物件導向(object-oriented programming,簡稱OOP)的程式設計。物件導向的最主要目的是提高程式的重複使用性。Python的整個概念是基於物件的。瞭解OOP是進一步學習Python的關鍵。下面是對物件導向的一種理解,基於分類。

相近物件,歸為類

在人類認知中,會根據 屬性相近 把東西 歸類 ,並給類命名。比如鳥類,其共同屬性有:有羽毛,卵生等。

物件導向就是模擬了以上人類認知過程。上面的‘東西’,在python中就稱為物件(object)

下面貼程式碼:

"""
    定義一個類別class,就是鳥類Bird。在隸屬於這個類比的語句塊中,定義了兩個變數,一個是有羽毛have_feather,一個是生殖方式way_of_reproduction,這兩個變數就是鳥類Bird的屬性attribute
"""
class Bird(object):
    have_feather = True
    way_of_reproduction  = `egg`

"""
    建立y一個物件,小雞summer,類別鳥中的一個物件,summer就有了鳥類的屬性,對屬性的引用是通過 物件.屬性 object.attribute 的形式實現的
"""
summer = Bird()
print(summer.have_feather, summer.way_of_reproduction)

日常認知中,我們在通過屬性識別類別的時候,有時根據這個東西能做什麼事情來區分類別。比如說,鳥會移動。這樣,鳥就和房屋的類別區分開了。這些動作會帶來一定的結果,比如移動導致位置的變化。

這樣的一些“行為”屬性為方法(method)。Python中通過在類的內部定義函式,來說明方法。

"""
重新定義鳥這個類別,新增一個方法屬性,就是表示移動的方法move,它的引數中有一個self,它是為了方便我們引用物件自身。方法的第一個引數必須是self,無論是否用到。
外兩個引數,dx, dy表示在x、y兩個方向移動的距離。move方法會最終返回運算過的position。在最後呼叫move方法的時候,我們只傳遞了dx和dy兩個引數,不需要傳遞self引數(因為self只是為了內部使用)。
"""
class
Bird(object): have_feather = True way_of_reproduction = `egg` def move(self, dx, dy): position = [0,0] position[0] = position[0] + dx position[1] = position[1] + dy return position summer = Bird() print(`after move:`,summer.move(5,8))

子類

類別本身還可以進一步細分成子類,比如鳥類可以進一步分為雞,大雁,黃鸝等。

在OOP物件導向程式設計中,可以通過 繼承(inheritance) 來表達上述概念:

class Chicken(Bird):
    way_of_move = `walk`
    possible_in_KFC = True

class Oriole(Bird):
    way_of_move = `fly`
    possible_in_KFC = False

summer = Chicken()
print(summer.have_feather)
print(summer.move(5,8))

新定義的雞Chicken類的,增加了兩個屬性:移動方式way_of_move,可能在KFC找到possible_in_KFC

在類定義時,括號裡為Bird。這說明,Chicken是屬於鳥類Bird的一個子類,即Chicken 繼承 自Bird。自然而然,Bird就是Chicken的父類。Chicken將享有Bird的所有屬性。儘管只宣告瞭summer是雞類,但它通過繼承享有了父類的屬性(無論是變數屬性have_feather還是方法屬性move)

新定義的黃鸝Oriole類,同樣繼承自鳥類。在建立一個黃鸝物件時,該物件自動擁有鳥類的屬性。

通過繼承製度,可以減少程式中的重複資訊和重複語句。如果分別定義兩個類,而不繼承自鳥類,就必須把鳥類的屬性分別輸入到雞類和黃鸝類的定義中。整個過程會變得繁瑣,因此,物件導向提高了程式的可重複使用性。

定義鳥類時括號中的object,當括號中為object時,說明這個類沒有父類,到頭了,可以把object也看作是一個類,它也有(類的)屬性和方法,可以為子類所繼承

將各種各樣的東西分類,從而瞭解世界,從人類祖先開始,我們就在練習了這個認知過程,物件導向是符合人類思維習慣的。所謂程式導向,也就是執行完一個語句再執行下一個,更多的是機器思維。通過物件導向的程式設計,我們可以更方便的表達思維中的複雜想法。

呼叫類的其它資訊

在定義方法時,必須有self這一引數。這個參數列示某一物件,物件擁有類的所有性質,可以通過self,呼叫類屬性似乎使用在定義類內部方法的時候,類似函式的形參,是這樣嗎?

 

class Human(object):
    laugh = `hahahaha`
    def show_laugh(self):
        print(self.laugh)
    def laugh_100th(self):
        for i in range(100):
            self.show_laugh()


li_lei = Human()          
li_lei.laugh_100th()

 

這裡有一個類屬性laugh。在方法show_laugh()中,通過self.laugh,呼叫了該屬性的值。還可以用相同的方式呼叫其它方法。方法show_laugh(),在方法laugh_100th中()被呼叫。

通過物件可以修改類屬性值。但這是危險的。類屬性被所有同一類及其子類的物件共享。類屬性值的改變會影響所有的物件。

__init__()方法

__init__()是一個特殊方法(special method)Python有一些特殊方法。Python會特殊的對待它們。特殊方法的特點是名字前後有兩個下劃線。如果你在類中定義了__init__()這個方法,建立物件時,Python會自動呼叫 這個方法。這個過程也叫初始化

class happyBird(Bird):
    def __init__(self,more_words):
        print(`We are happy birds.`,more_words)


summer = happyBird(`Happy!Happy!`)
# 執行結果
# We are happy birds. Happy!Happy!

我們看到,儘管我們只是建立了summer物件,但__init__()方法被自動呼叫了。最後一行的語句(summer = happyBird…)先建立了物件,然後執行:

summer.__init__(more_words)

`Happy!Happy!` 被傳遞給了__init__()的引數more_words

物件的性質

上面講到了許多屬性,但這些屬性是類的屬性。所有屬於該類的物件會共享這些屬性。比如說,鳥都有羽毛,雞都不會飛。

在一些情況下,定義物件的性質,用於記錄該物件的特別資訊。比如說,人這個類。性別是某個人的一個性質,不是所有的人類都是男,或者都是女。這個性質的值隨著物件的不同而不同。李雷是人類的一個物件,性別是男;韓美美也是人類的一個物件,性別是女。

當定義類的方法時,必須要傳遞一個self的引數。這個引數指代的就是類的一個物件。我們可以通過操縱self,來修改某個物件的性質。比如用類來新建一個物件,即下面例子中的li_lei, 那麼li_lei就被self表示。我們通過賦值給self.attribute,給li_lei這一物件增加一些性質,比如說性別的男女。self會傳遞給各個方法。在方法內部,可以通過引用self.attribute,查詢或修改物件的性質。

這樣,在類屬性的之外,又給每個物件增添了各自特色的性質,從而能描述多樣的世界。

class Human(object):
    def __init__(self, input_gender):
        self.gender = input_gender
    def printGender(self):
        print(self.gender)

li_lei = Human(`male`)   # 這裡,`male`作為引數傳遞給__init__()方法的input_gender變數。
print(li_lei.gender)
li_lei.printGender()

# 執行結果
# male
# male

在初始化中,將引數input_gender,賦值給物件的性質,即self.gender。

li_lei擁有了物件性質gender。gender不是一個類屬性。Python在建立了li_lei這一物件之後,使用li_lei.gender這一物件性質,專門儲存屬於物件li_lei的特有資訊。

物件的性質也可以被其它方法呼叫,呼叫方法與類屬性的呼叫相似,正如在printGender()方法中的呼叫。

 

 

總結 

嗯,多做總結是個好習慣!!!佩服大神

將東西根據屬性歸類 -> 將object歸為class

方法也是一種屬性,如動作

用繼承來說明父類-子類關係,子類自動具有父類的所有屬性。

self代表了根據類定義而建立的物件。

 

建立一個物件:物件名 = 類名()

引用物件屬性:object.attribute

 

通過self呼叫類屬性

__init__():在建立物件時自動執行

類屬性與物件屬性,即與物件的性質的區別

最後回過頭來看看,一切皆物件,“Everything is Object”。

Python基礎10 反過頭來看看就這樣吧!

 

相關文章