2011-11-22 22 views
4

如果在其他地方問過這個問題,我表示歉意,但我不知道如何制定這個問題。通過面向對象編程的Python參數

我是物理學家,Python是我第一個面向對象的語言。我喜歡這種乾淨的代碼語言,並且不知何故,一切都按照預期工作(由我來完成)。

然而,我有一個問題,也許它是更多的設計選擇,但由於我的面向對象編程是自學而且非常基本的,我不知道要走哪條路。

所以問題是:我應該主要傳遞參數還是直接操作對象數據?因爲,比如說:

class test(object): 

    ... 

    def dosomething(self, x, y): 
     # do someting with x, y involving a lot of mathematic manipulations 

    def calcit(self): 
     k = self.dosomething(self.x[i], self.y[i]) 
     # do something else with k 

產生比沒有通過x, y,但經過i,每次寫self明確更清潔的代碼。你喜歡什麼,或者這是一個面向對象的範例,我打破了?

性能方面,這應該沒有什麼不同,因爲參數是通過引用傳遞的,對吧?

+1

嘗試使用某種方法區分函數名稱內的單詞,例如'calc_it'或'do_something'。 – hochl

回答

2

對象範例是: 您將方法和屬性組合在一起並將它們稱爲對象。因此,如果你恰好操縱其中一個屬性,而不需要將它們作爲參數傳遞,那麼你應該使用該對象的屬性。如果你使用其他的東西,那麼你必須將它作爲參數傳遞。

而且,如果每次都困擾你自己寫自己,沒有什麼能夠阻止你將對象的值轉化爲另一個變量!

爲了完成,你的函數需要x和y作爲參數,不應該在你的對象中,而應該在你的對象之外,如果你真的想做這樣的事情,那麼它的理由是沒有理由通過你的對象作爲第一個參數(即使它是隱含的),如果你不使用它。

和耶是表現明智,它應該是非常相似!

+0

即使它不改變對象的外觀?無視例如exp( - 1j * x * y)比exp( - 1j * self.x [i] * self.y [i])更可讀? – thafritz

+0

你的外表是什麼意思? 如果你的意思是它不改變任何對象的屬性的值,那麼你有兩種情況: - 它返回一個值取決於其中一個對象的值,然後就OK - 它只需要外部參數,計算它們,那麼它應該在你的對象之外。 關於可讀性,你可以用x,y = self.x [i],self.y [i]來啓動你的函數,現在你有了你的值並且它是可讀的! – m09

+0

第一種情況適用,我想我是一個極簡主義和x,y = self.x [i] ...似乎是不必要的代碼行 – thafritz

4

我應該主要傳遞參數或直接操縱的對象的數據對象作爲與狀態系統的

思考。如果數據屬於對象的狀態,那麼它應該作爲成員打包在對象中。否則,它應該作爲參數傳遞給它的方法。

在你的例子中,你應該做什麼取決於你是否想dosomethingxy不是對象的成員。如果您沒有,那麼您可以從self獲取dosomethingxy

另外,請記住,如果你不在方法中使用self,那麼它可能根本不應該是一種方法,而是一種獨立功能。

性能方面,這應該沒有什麼不同,因爲參數是通過引用傳遞的,對吧?

我根本不用擔心這方面的表現。

+2

+1,而且我看過很多不好的代碼,因爲它在性能不重要的程序部分執行得非常好。 – hochl

+2

表示同意,特別是當你是初學者時,目標是編寫乾淨的代碼,而不是快速的代碼。無論如何,你最終會以最快的方式代碼。 – m09

+0

即時通訊不是初學者,而是初學者,我認爲如果你不需要複製大數據數組 – thafritz