2010-08-27 75 views
2

我有一個Sleep類(對象),並在該類中有一個sleepInSeconds()方法。Pythonic對象實例化問題

是否有這樣做有什麼區別:

wait = Sleep() 
wait.sleepInSeconds(10) 

而且這樣做:

wait = Sleep().sleepInSeconds(10) 

Sleep().sleepInSeconds(10) 

哪個更正確(或 'Python化'),是什麼我可以遇到哪種問題?是否有OO編程中的一個總體負責人應該讓我得到這個答案?

回答

3

所有三個在功能上都是正確的。主要區別在於你打算在這段代碼之後做什麼。

wait = sleep() 
wait.sleepInSeconds(10) 

上面的代碼將離開你一個sleep對象之後遊逛,名稱wait下。如果你打算多次使用這個對象,你可能會想要這個。

wait = sleep().sleepInSeconds(10) 

以上將投入sleepInSeconds()返回值等。在某些情況下,這可能是None。它也可以是一個整數。請注意,您可以讓sleepInSeconds()返回self,在這種情況下,它在功能上等同於第一個塊。

sleep().sleepInSeconds(10) 

上面只會睡10秒。將不會有剩餘的對象sleep。如果您不想再次使用該對象,請使用此選項。

在我看來,最Pythonic是第一個也是最後一個。如果要保留物體,請使用第一個,如果以後不需要物體,請使用第二個。

+0

這就是我一直在尋找什麼,每種方式留下(或不)。 python如何處理對象實例化,而不需要保留對象等。 儘管所有的反饋都很棒。 – Freddy 2010-08-27 19:03:01

3

除非你想重複使用你的睡眠實例,否則保持它是浪費(分配wait)。不要在一行上堵塞太多東西。

更真實的Python的風格是隻使用庫:P

import time 
time.sleep(seconds) 
+1

你怎麼知道'sleepInSeconds()'告訴當前線程要等待?也許它告訴一個怪物在某個遊戲中去睡覺。 :-) – carl 2010-08-27 18:53:10

+0

我想我沒有給出完整的範圍,這個類將會有其他幾個方法不可避免地將輸入轉化爲可接受的值,以傳遞給time.sleep(秒)。所以它確實使用這些庫,但會在其周圍建立一些其他自定義代碼。 – Freddy 2010-08-27 18:55:57

4

如果sleepInSeconds是一個靜態方法(從功能上看見過)你是濫用睡眠類的命名空間。聽起來有點像Java背景。

因爲python具有非常好的命名空間支持,所以你可能最好在模塊命名空間(不是類)中使sleepInSeconds成爲函數。

如果你仍然想在一個類中使用它,並且該方法不使用實例變量(fron self),那麼你可以將該方法註釋爲靜態(@staticmethod),然後應該使用類名稱,而不是該實例,你明確表示它是一個靜態方法,它不會改變你的實例的狀態。

因此,你的選擇似乎不是pythonic對我來說。

如果sleepInSeconds確實改變實例狀態,那麼我會去wait.sleepInSeconds(10),因爲你可能需要改變狀態。

+0

是的,非常Java的背景下,仍然圍繞不同的方式來組織代碼(模塊文件與多個類與每個文件的類等) 睡眠類是我創建處理不同的模塊的一部分睡眠/時間要求與我一起工作。 很好的反饋,謝謝。 – Freddy 2010-08-27 18:58:45

+0

@Freddy我自己有一個Java bqckground,所以它不是很難猜測:) – extraneon 2010-08-27 19:04:15

4
wait = sleep() 
wait.sleepInSeconds(10) 

wait = sleep().sleepInSeconds(10) 

有完全不同的結果。在這第一種情況下等待對睡眠實例的引用。在第二種情況下,等待對sleepInSeconds的返回值的引用。你需要弄清楚你想要得到什麼。兩種情況都是Pythonic。他們質疑的是你期待什麼。