Pythonic Object Instantiation问题

时间:2010-08-27 18:36:20

标签: python object

我有一个Sleep类(对象),并且在该类中有一个sleepInSeconds()方法。

这样做有什么区别:

wait = Sleep()
wait.sleepInSeconds(10)

这样做:

wait = Sleep().sleepInSeconds(10)

Sleep().sleepInSeconds(10)

哪个更正确(或'Pythonic'),我可以遇到哪些问题?是否有一些OO编程的首要原则应该让我得到这个答案?

4 个答案:

答案 0 :(得分:4)

如果sleepInSeconds是一个静态方法(从功能的角度来看),则会误将sleep类作为命名空间。听起来有点像java背景。

你可以更好地使sleepInSeconds成为模块命名空间(而不是类)中的函数,因为python具有非常好的命名空间支持。

如果你仍然希望在一个类中使用它,并且该方法不使用实例变量(fron self),那么你可以将该方法注释为static(@staticmethod),然后你应该使用类名,而不是例如,你明确表示它是一个静态方法,它不会改变你的实例的状态。

所以你们两个选项对我来说似乎都不是pythonic。

如果sleepInSeconds确实改变了实例状态,那么我会去wait.sleepInSeconds(10),因为你可能需要在某处改变状态。

答案 1 :(得分:4)

wait = sleep()
wait.sleepInSeconds(10)

wait = sleep().sleepInSeconds(10)

结果完全不同。在第一种情况下,等待对睡眠实例的引用。在第二种情况下,等待引用sleepInSeconds的返回值。你需要弄清楚你想要得到什么。两种情况都是Pythonic。他们质疑你期待等待的是什么。

答案 2 :(得分:3)

这三个在功能上都是正确的。主要区别在于您在这段代码之后打算做什么。

wait = sleep()
wait.sleepInSeconds(10)

以上代码会在sleep名称后面留下wait个对象。如果您打算更多或更晚使用此对象,您可能想要这个。

wait = sleep().sleepInSeconds(10)

以上将使sleepInSeconds()的返回值等待。在某些情况下,这可能是None。它也可以是整数。请注意,您可以sleepInSeconds()返回self,在这种情况下,它在功能上等同于第一个块。

sleep().sleepInSeconds(10)

以上只会睡10秒钟。剩下没有sleep个对象。如果您不想再次使用该对象,请使用此选项。

在我看来,大多数Pythonic是第一个也是最后一个。如果你想保持对象,可以使用第一个,如果以后不需要对象,可以使用第二个。

答案 3 :(得分:3)

除非你想重复使用你的睡眠实例,否则保持它是一种浪费(分配wait)。不要在一条线上塞满太多东西。

更真实的Pythonic风格是使用库:P

import time
time.sleep(seconds)