2016-07-14 4 views
2

없이 어떤 이유는파이썬 : 클래스 인스턴스의 의미가 변수

instance = MyApp() 

    instance.run() 

나는 OOP에 비교적 새로운 오전과 내가 물건을 작성봤을 때 상당히 혼란스러워했다

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

MyApp().run() 

대신 일을 할 수있는 첫 번째 코드 스 니펫의 방식으로 왜 이렇게 흔한 이유가 있을까요?

두 기능의 차이점은 무엇입니까?

+4

특히'instance' 변수를'.run'을 호출 한 후에 다시 사용하지 않을 경우 입력이 줄어 듭니다. 우리는 단지 게으르다.이 경우에는 변수를 인스턴스에 유지할 필요가 없거나 유지하려고하지 않는다. – Bahrom

답변

4

기본적으로 첫 번째 코드 블록에서 두 번째 코드 블록과 동일한 작업을 수행하고 있습니다. 차이점은 첫 번째 인스턴스에서 은 다시 인스턴스화 된 MyApp() 클래스를 다시 사용할 수 없다는 것입니다..

그러나 두 번째 예에서는 재사용 할 수있는 객체를 정의합니다. @arekolek으로

편집

는 말했다 : 대신 변수에 할당하는) MyApp.run를 (사용하는 경우

, 파이썬은 즉시 객체가 차지하는 메모리를 해제합니다 메소드 run()에 대한 호출이 완료되었습니다.

p.s : 나는 그냥 인스턴스화 MyApp() 개체를 재사용 할 수없는 이상입니다

+1

당신은 착각하지 않았습니다. –

+1

@MadPhysicist 오 고마워! 그건 구제입니다 –

+0

당신이 더 이상 서스펜스가 아니라는 소식을 듣고 기쁩니다 :) –

0

... 착각 될 수 파이썬에서 프로 아닙니다.

변수에 할당하는 대신 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'은 객체가 사용하는 실제 메모리에 아무 것도하지 않습니다. –