2016-07-14 14 views
2

Почему я могу сделатьPython: Какой смысл класса конкретизации без переменной

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

MyApp().run() 

а не делать

instance = MyApp() 

    instance.run() 

Я довольно новыми для объектно-ориентированного программирования и был достаточно смущен, когда я видел вещи написаны на пути первого фрагмента кода. Есть ли причина, почему это кажется таким распространенным?

есть функциональная разница между двумя?

+4

Меньше ввода текста, особенно если вы никогда не собираетесь повторно использовать эту переменную 'instance' после вызова' .run' на ней. Мы просто ленивы и в этом случае не нуждаемся/хотим сохранить экземпляр в переменной. – Bahrom

ответ

4

Вы в основном делаете то же самое в первом блоке кода, что и во втором. Разница в том, что в первом вы не можете повторно использовать экземпляр класса MyApp() снова.

Во втором примере, однако, вы определяете объект, который можно использовать повторно.

EDIT

Как @arekolek заявил:

Если вы используете MyApp.run() вместо того, чтобы назначить его переменной, Python будет освободить память, занятую объектом, как только вызов метода run() завершен.

p.s: Я не профессионал в питон может ошибиться ...

+1

Вы не ошибаетесь. –

+1

@MadPhysicist oh спасибо! Это облегчение –

+0

Я рад слышать, что вы больше не находитесь под напряжением :) –

0

Это больше, чем просто не в состоянии повторно использовать инстанцированный MyApp() объект.

Использование MyApp.run() вместо назначения его переменной позволяет Python освобождать память, занятую объектом, как только завершается вызов run().

Во втором примере вам нужно вручную указать 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' increments' count', печатает это значение, ждет секунду, а затем вызывает себя. Когда вызывается 'run', экземпляр не может быть собран, поскольку он все еще необходим. В вашем коде 'del instance' удаляет только« экземпляр »из локального пространства имен и уменьшает счетчик ссылок (с учетом сбора мусора, когда ссылки не оставлены). Само по себе 'del' ничего не делает для фактической памяти, используемой объектом. –