2013-05-08 81 views
1

我只是在研究一個大類的層次結構,並認爲可能默認情況下,類中的所有方法都應該是classmethods。默認情況下,類中的方法應該是classmethod嗎?

我的意思是,很少有人需要更改對象的實際方法,並且可以明確傳遞任何需要的變量。而且,這種方式會有更少的方法讓人們可以改變對象本身(更多的打字方式是以其他方式進行),人們更傾向於默認情況下是「功能性」的。

但是,我是一個newb並希望找出我的想法(如果有任何:)的缺陷。

+0

你的前提是錯誤的。什麼讓你有那個想法?如果它不是實例方法,只需將其設置爲模塊級功能即可。 – delnan 2013-05-08 11:48:36

+0

對不起,我很難跟隨你想說的話。你的問題到底是什麼? – 2013-05-08 11:48:41

+0

@MartijnPieters:我只是想知道爲什麼它是python中的方法,默認情況下將對象本身作爲輸入而不是類。因爲大多數時候你並不需要在對象本身上設置一個狀態,例如我正在處理一個數據庫類,並且我定義了一個方法,該方法給了我關於數據的一些統計信息,它只需要一些數據而不需要真的是初始化可能會很昂貴的完整對象,那麼爲什麼不把classmethod作爲默認值呢?但我想這可能只是在我目前的用例中發生。 – Pushpendre 2013-05-08 17:48:31

回答

1

如果該方法不訪問任何對象的狀態,但是特定於該對象的類,那麼它是一個適合作爲類方法的好候選者。

否則,如果它更通用,那麼只需使用在模塊級定義的函數,不需要使它屬於特定的類。

我發現,classmethods實際上是非常罕見的,當然不是默認的。應該有很多很好的代碼(例如github)來獲取示例。

+1

+1它完全掌握在開發者手中,沒有一般的答案。但通常不需要類方法。 – apparat 2013-05-08 11:56:16

+0

將例程作爲'classmethod'放入類中通常會聲明此例程與此類的邏輯連接。如果它正在訪問任何類變量,這將是對這種連接的強烈暗示。但是,如果它不訪問這個類的任何東西,但是在邏輯上是連接的,它應該放在類中,然後可能是一個'staticmethod'。 – Alfe 2013-05-08 12:14:34

3

將classmethods作爲默認類是一個衆所周知但過時的範例。這就是所謂的模塊化編程。您的課程通過這種方式成爲模塊。

面向對象的範例(OOP)大多被認爲優於模塊化範式(它更年輕)。主要區別在於部分代碼默認與一組數據(稱爲對象)關聯 - 因此不是類方法。

事實證明,這在實踐中更加有用。結合繼承等其他OOP體系結構思想,可以提供直接的方式在開發人員頭部表示模型。

使用對象方法我可以編寫可用於各種類型對象的抽象代碼;在編寫例程時,我不必知道對象的類型。例如,我可以編寫一個max()例程,它將列表中的元素相互比較以找出最大值。然後使用>運算符進行比較,該運算符實際上是元素的對象方法(在Python中,這是__gt__(),在C++中它將是operator>()等)。現在,對象本身(可能是數字,也可能是日期等)可以處理其自身與其他類型的比較。在這個代碼可以寫爲短

a > b # in Python this calls a.__gt__(b) 

,而只有有classmethods你就必須把它寫成

type(a).__gt__(a, b) 

這是可讀的要少得多。

+1

感謝您的回答,我會查閱一些關於模塊化編程的文章,並瞭解爲什麼它變得過時。當我獲得足夠的業力時,我會給你投票:) – Pushpendre 2013-05-08 12:14:54

相關問題