我只是在研究一個大類的層次結構,並認爲可能默認情況下,類中的所有方法都應該是classmethods。默認情況下,類中的方法應該是classmethod嗎?
我的意思是,很少有人需要更改對象的實際方法,並且可以明確傳遞任何需要的變量。而且,這種方式會有更少的方法讓人們可以改變對象本身(更多的打字方式是以其他方式進行),人們更傾向於默認情況下是「功能性」的。
但是,我是一個newb並希望找出我的想法(如果有任何:)的缺陷。
我只是在研究一個大類的層次結構,並認爲可能默認情況下,類中的所有方法都應該是classmethods。默認情況下,類中的方法應該是classmethod嗎?
我的意思是,很少有人需要更改對象的實際方法,並且可以明確傳遞任何需要的變量。而且,這種方式會有更少的方法讓人們可以改變對象本身(更多的打字方式是以其他方式進行),人們更傾向於默認情況下是「功能性」的。
但是,我是一個newb並希望找出我的想法(如果有任何:)的缺陷。
如果該方法不訪問任何對象的狀態,但是特定於該對象的類,那麼它是一個適合作爲類方法的好候選者。
否則,如果它更通用,那麼只需使用在模塊級定義的函數,不需要使它屬於特定的類。
我發現,classmethods實際上是非常罕見的,當然不是默認的。應該有很多很好的代碼(例如github)來獲取示例。
將classmethods作爲默認類是一個衆所周知但過時的範例。這就是所謂的模塊化編程。您的課程通過這種方式成爲模塊。
面向對象的範例(OOP)大多被認爲優於模塊化範式(它更年輕)。主要區別在於部分代碼默認與一組數據(稱爲對象)關聯 - 因此不是類方法。
事實證明,這在實踐中更加有用。結合繼承等其他OOP體系結構思想,可以提供直接的方式在開發人員頭部表示模型。
使用對象方法我可以編寫可用於各種類型對象的抽象代碼;在編寫例程時,我不必知道對象的類型。例如,我可以編寫一個max()
例程,它將列表中的元素相互比較以找出最大值。然後使用>
運算符進行比較,該運算符實際上是元素的對象方法(在Python中,這是__gt__()
,在C++中它將是operator>()
等)。現在,對象本身(可能是數字,也可能是日期等)可以處理其自身與其他類型的比較。在這個代碼可以寫爲短
a > b # in Python this calls a.__gt__(b)
,而只有有classmethods你就必須把它寫成
type(a).__gt__(a, b)
這是可讀的要少得多。
感謝您的回答,我會查閱一些關於模塊化編程的文章,並瞭解爲什麼它變得過時。當我獲得足夠的業力時,我會給你投票:) – Pushpendre 2013-05-08 12:14:54
你的前提是錯誤的。什麼讓你有那個想法?如果它不是實例方法,只需將其設置爲模塊級功能即可。 – delnan 2013-05-08 11:48:36
對不起,我很難跟隨你想說的話。你的問題到底是什麼? – 2013-05-08 11:48:41
@MartijnPieters:我只是想知道爲什麼它是python中的方法,默認情況下將對象本身作爲輸入而不是類。因爲大多數時候你並不需要在對象本身上設置一個狀態,例如我正在處理一個數據庫類,並且我定義了一個方法,該方法給了我關於數據的一些統計信息,它只需要一些數據而不需要真的是初始化可能會很昂貴的完整對象,那麼爲什麼不把classmethod作爲默認值呢?但我想這可能只是在我目前的用例中發生。 – Pushpendre 2013-05-08 17:48:31