我有一个Sleep
类(对象),并且在该类中有一个sleepInSeconds()
方法。
这样做有什么区别:
wait = Sleep()
wait.sleepInSeconds(10)
这样做:
wait = Sleep().sleepInSeconds(10)
或
Sleep().sleepInSeconds(10)
哪个更正确(或'Pythonic'),我可以遇到哪些问题?是否有一些OO编程的首要原则应该让我得到这个答案?
答案 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)