class MyApp(App):
def build(self):
return Label(text="Hello World")
MyApp().run()
而不是做
instance = MyApp()
instance.run()
我是相当新的OOP和是相当迷茫的时候,我看到的东西写在第一个代码片段的方式。这有什么原因,这似乎很常见?
这两者之间是否存在功能差异?
class MyApp(App):
def build(self):
return Label(text="Hello World")
MyApp().run()
而不是做
instance = MyApp()
instance.run()
我是相当新的OOP和是相当迷茫的时候,我看到的东西写在第一个代码片段的方式。这有什么原因,这似乎很常见?
这两者之间是否存在功能差异?
你基本上在第一个代码块和第二个代码块做同样的事情。 区别在于,在第一个中,不能再次使用实例化的MyApp()类。
但在第二个示例中,您定义了一个可以重用的对象。
编辑
由于@arekolek说:
如果使用MyApp.run(),而不是将其分配给一个变量,Python会释放尽快对象所占用的内存调用方法run()完成。
P.S:我不是一个职业的蟒蛇可能是误会......
你没错。 –
@MadPhysicist哦谢谢!这是一个解脱 –
我很高兴听到你不再悬念:) –
这不仅仅是不能够重复使用实例化对象MyApp()
更多。
使用MyApp.run()
而不是将其赋值给一个变量,只要run()
调用完成,Python就释放对象占用的内存。
在第二个示例中,如果要释放内存,则需要手动输入del instance
。一旦您离开已定义instance
的块,内存也将被释放。例如:
def foo():
instance = MyApp()
instance.run()
foo()
# Memory freed automatically
instance = MyApp()
instance.run()
del instance
MyApp().run() # No need to clean-up
这是真的吗?我假设'run'方法将需要每个循环中的实例,而不允许收集内存。 –
通过“每个循环”你的意思是在我的例子中的三个调用中的每一个?我的代码中的每个'run()'都使用了一个不同的MyApp类实例,所以是的。 – arekolek
考虑一个实例变量为'count'的类和一个实例方法'run'。 'run'主体增加'count',打印该值,等待一秒钟,然后自行调用。一旦'run'被调用,实例就不能被收集,因为它仍然是需要的。在你的代码中,'del instance'只能从本地命名空间中删除'instance',并减少它的引用计数(当没有引用时允许垃圾收集)。就其本身而言,'del'对于对象使用的实际内存没有任何作用。 –
减少打字,特别是如果你不打算在调用'.run'后重新使用'instance'变量。我们只是懒惰,在这种情况下,不需要/想要将实例保留在变量中。 – Bahrom