簡單定義Python和Scala的類和對象
在現代編程語言里,類和對象都是繞不過的話題。對象這個概念可以是生活的抽象,為了更好的理解使用書來做比喻,每一本書都是一個對象,也就是一個實例,書本身具有的頁碼等等固定不變的東西,就是屬於書的性質(屬性),而我們對書有著一系列的操作,比如打開書,合上書,在編程語言里稱為方法。我們把各種各樣的書都可以抽象為一種類型,也就是類。先有類,再有實例,類是對象的藍本。
我們以書籍為例,先看看如何構建一個類:
Scala:
Python:
Scala的類使用了{}將整個類的定義包含起來,而Python的類通過縮進符來包含整個類的定義。Scala的Python選取類名的規則都是一樣的,採用駝峰式命名,單詞的首字母大寫。Python的類都繼承自object,而Scala的類就是一個純粹的類。在Scala使用new Book來創建一個實例,而Python使用Book()來實例(實際上是__new__的語法糖)。我們可以在類的定義了加上一些好玩的東西,比如屬性和實例。
說明一下:為了方便,Scala使用idea作為編輯器,構建一個Test的單例對象運行程序(後面會聊到的,先跳過)。Python使用Spyder作為編輯器,使用if __name__ == "main":去模擬main方法。因為只是為了講解概念,會略去很多工程上的細節。
初始化:
書一般都會有書名,假設書名可以區分書的唯一性,在創建實例時必須要給這個實例一個書名,那麼如何給Book這個類添加書名這個屬性:
Scala:
Python:
在Scala的Book類後面的圓括弧里跟著一個標識符name(稱為類參數),使用這種方法構造的類,要求使用者在剛開始創建這個實例時就必須要提供相應的數據,我們在Book這個類裡面加上了println方法,在創建book這個實例時,就會列印出來name這個參數。Python在實例的初始化,使用__init__的內置方法,self是Python的一個習慣命名,因為Python在類方法上都會在第一個參數傳入這個類的實例,我們把傳入的name賦值給self.name(實例屬性),再print出來。
屬性:
我們去看一本書,可能會首先大概的翻一翻去獲得這個本書的頁數pages這個屬性。
Scala:
Python:
Scala和Python定義了一個類屬性pages,並且在實例化後通過book.pages = 100進行賦值,表示這本叫做Hello World!的書有一百頁。值得注意的是Scala我們使用了var變數,而不是val變數,這樣就可以在後續代碼里對其重新賦與不同的值。
私有屬性:
假設這本書你已經寫上屬於你的獨有筆記,不希望別人看到,那麼我們可以定義私有屬性來防止別人的偷窺。
Scala:
Python:
這時候Scala會報如下錯誤:
Python會告訴你:
Scala通過在變數前面加上private來防止實例化後,有人偷看筆記,而Python則是在notes前面加一個下劃線表示這個屬性不公開(當然這不是絕對意義上的不公開,要是你知道私有屬性存在,無論是Scala還是Python都會有辦法看到私有屬性)。
方法:
當然筆記不會是無緣無故存在的,我們需要給這本書寫上筆記,這個時候我們就需要使用方法,也就是某種操作修改或者寫入筆記。
Scala:
Python:
Scala里我們寫下了writeNotes方法,它接受外部傳過來的參數note,並且將"very good!"重新賦值給notes,而Python則使用write_notes將"very good!"賦值給_notes變數。這裡就體現了Scala和Python對於方法命名的小小區別,Scala使用了首字母小寫,其餘單詞開頭都是大寫,而Python的分隔符使用_。(這裡應該要有返回值,表示確實寫入成功,為了簡便省略了。)
剩下的是獨屬於Scala的內容了,講講單例對象。Scala的類定義裡面是不允許存在靜態方法的,所以Scala提供了object這種的單例對象,單例對象和類的定義很像,但是單例對象不需要實例化,單例對象本身就是一等的對象,單例對象的名稱可以理解為附加在對象的上的名稱。如果在同一源碼中單例對象和某個類共用名字,那麼這個單例對象稱為這個類的伴生對象。類和它的伴生對象可以互相訪問私有成員。沒有同名的類的單例對象稱為獨立對象,也就是上文中的test這個對象,使用main方法承載,作為程序的入口。(此代碼僅僅只是示例,平時不要這麼玩)
※資深程序員:給Python軟體開發測試的25個忠告!
※R開發人員使用Python
TAG:Python |