2012-08-13 2 views
6

함수 : 나는 '예'의 여러 인스턴스를 만드는 경우파이썬 : 나는 몇 가지 기능을 가진 클래스가있는 경우 클래스와 메모리

class Example: 

    def func1(self): 
     print 'Hi1' 
    def func2(self): 
     print 'Hi2' 
    def func3(self): 
     print 'Hi3' 

를, 클래스의 각 인스턴스 저장소를 기능의 자신의 사본을한다 ? 아니면 파이썬은 정의를 한 번만 저장하고 인스턴스가 클래스의 함수를 사용할 때마다 찾아 보는 것이 현명한 방법입니까?

또한 정적 함수는 어떻습니까? 클래스는 각 정적 함수의 복사본을 하나만 유지합니까?

+0

성능상의 차이가 무엇을 의미하는지 확신 할 수 없습니다. – rsegal

+0

메신저는 수백만 개의 클래스 인스턴스를 인스턴스화하므로 메모리가 어떻게 영향을 받는지 이해해야합니다. –

답변

12

클래스를 인스턴스화 할 때 인스턴스 메서드 나 정적 메서드가 아닌 새 함수 개체가 만들어지지 않습니다. obj.func1을 통해 인스턴스 메서드에 액세스 할 때 "바인딩 된 메서드"라는 새 래퍼 개체가 만들어지고 필요한만큼 길게 유지됩니다. 래퍼 객체는 가중치이며 기본적으로 기본 함수 객체 및 인스턴스 (함수가 호출 될 때 self 매개 변수로 전달됨)에 대한 포인터를 기본적으로 포함합니다.

staticmethod을 사용하는 것이 거의 대부분 파이썬에서 실수입니다. 그것의 존재는 역사적인 실수입니다. 정적 메서드가 필요하다고 생각하면 대개 모듈 수준 함수가 필요합니다.

+0

멋지게 넣고 이해할 수 있습니다 - staticmethod에 대한 좋은 참고입니다. –

+0

또한 함수 객체 자체가 바이트 코드를 공유 할 수 있으며 IIRC는 메타 데이터 (이름, 모듈, docstring, 캡처 된 변수 등) 그. – delnan

+0

@delnan : * local * 함수, 즉 함수 내에 정의 된 함수에만 해당됩니다. 클래스 본문은 한 번만 실행되며 클래스 본문의 함수에 대해서는 함수 개체와 코드 개체 사이에 일대일 대응이 있습니다. –

0

기능은 정적 및 비 정적 모두 클래스에 "저장"됩니다.

관련 문제