2016-07-14 23 views
2

为什么我做的Python:什么是类实例化的意识没有变

class MyApp(App): 
    def build(self): 
     return Label(text="Hello World") 

MyApp().run() 

而不是做

instance = MyApp() 

    instance.run() 

我是相当新的OOP和是相当迷茫的时候,我看到的东西写在第一个代码片段的方式。这有什么原因,这似乎很常见?

这两者之间是否存在功能差异?

+4

减少打字,特别是如果你不打算在调用'.run'后重新使用'instance'变量。我们只是懒惰,在这种情况下,不需要/想要将实例保留在变量中。 – Bahrom

回答

4

你基本上在第一个代码块和第二个代码块做同样的事情。 区别在于,在第一个中,不能再次使用实例化的MyApp()类

但在第二个示例中,您定义了一个可以重用的对象。

编辑

由于@arekolek说:

如果使用MyApp.run(),而不是将其分配给一个变量,Python会释放尽快对象所占用的内存调用方法run()完成。

P.S:我不是一个职业的蟒蛇可能是误会......

+1

你没错。 –

+1

@MadPhysicist哦谢谢!这是一个解脱 –

+0

我很高兴听到你不再悬念:) –

0

这不仅仅是不能够重复使用实例化对象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 
+0

这是真的吗?我假设'run'方法将需要每个循环中的实例,而不允许收集内存。 –

+0

通过“每个循环”你的意思是在我的例子中的三个调用中的每一个?我的代码中的每个'run()'都使用了一个不同的MyApp类实例,所以是的。 – arekolek

+0

考虑一个实例变量为'count'的类和一个实例方法'run'。 'run'主体增加'count',打印该值,等待一秒钟,然后自行调用。一旦'run'被调用,实例就不能被收集,因为它仍然是需要的。在你的代码中,'del instance'只能从本地命名空间中删除'instance',并减少它的引用计数(当没有引用时允许垃圾收集)。就其本身而言,'del'对于对象使用的实际内存没有任何作用。 –

相关问题