2010-08-27 117 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。他们质疑的是你期待什么。