2011-10-29 5 views
4

클래스가있는 모듈을 가져 오면 해당 클래스를 처음 읽을 때 실행되는 클래스와 클래스 개체가 만들어집니다. 무슨 일이 일어날 지 영향을 줄 수있는 방법이 있습니까?클래스 정의시 어떤 코드가 실행됩니까?


편집 : 나는

내가 ++ 나 C에서 자기 반성을 할 수 뭔가 더 낮은 수준을 찾고 있어요 ... 내 질문이 조금 너무 일반적인 수 있습니다 알고 있습니다. 내 C++ 응용 프로그램을 Python으로 확장합니다. 나는 C++로 정의되고 Python으로 노출되는 몇 가지 클래스를 가지고있다. 사용자는 스크립트에서 이러한 클래스를 상속 할 수 있으며 처음 정의 될 때 스크립트에 대한 세부 정보를 얻을 수 있기를 원합니다.

+0

실제로 클래스를 생성하기 위해 실행되는 코드는 이전 스타일이든 새로운 스타일이든 상관없이 우선적 인 비단뱀 버전이 있습니까? – Thomas

+0

@Thomas 그렇다면 Python 3이되자. –

답변

5

많은 가능한 일이 발생할 수 있습니다. 가장 기본적인 :

블록을 처음 읽을 때 class 블록의 내용이 실행됩니다. 모듈을 가져올 때

class Foo(object): 
    print "bar" 

    def __init__(self): 
     print "baz" 

bar을 인쇄합니다 :

는 행동이 예제를이를 참조하십시오.

클래스에 메타 클래스가 정의되어 있으면 코드 블록을 실행 한 후에 메타 문자 __new__이 실행됩니다.

예 :

class MyMeta(type): 
    def __new__(mcs, name, bases, kwargs): 
     print "I'm the metaclass, just checking in." 
     return type.__new__(mcs, name, bases, kwargs) 


class Foo(object): 
    __metaclass__ = MyMeta 

    print "I'm the Foo class" 

출력 :

I'm the Foo class 
I'm the metaclass, just checking in. 

나는이 내가 익숙 무엇 단지이며, 반드시 다른 비트뿐만 아니라 실행할 수 있어요.

+0

나는이 질문이 C++ 관점에서 파이썬 객체의 세부 사항에 관한 것이라고 생각한다. 나는 생각한다. 분명히 내 대답은 그 문제를 다루지는 않았지만, 그 질문이이 의도를 더 명확하게 진술하기 전에 편집되었다. –

3

metaclasses에 관심이 있으실 것입니다.이 클래스는 클래스 생성을 제어하는 ​​클래스입니다.

4

B와 C에서 상속 한 클래스 A를 정의하면 다음과 같이 실행됩니다. A = type('A', (B, C), m 여기서 m은 클래스 멤버가 포함 된 사전입니다.

메타 클래스 프로그래밍을 사용하여 프로세스에 영향을 줄 수 있습니다. blog poststutorials on the subject의 부족은 없습니다.

2

클래스 정의의 코드는 다른 코드와 마찬가지로 실행되지만 작성된 변수 (함수 정의 포함)는 전역이 아닌 클래스의 컨텍스트에있게됩니다. 이 조건부 코드를 추가하여 동적으로 클래스 정의를 변경할 수 있음을 의미한다 :

나는이 작업을 수행 본 적이 없다, 그리고 그 일에 대한 이유 생각할 수 없다 그러나
class A(object): 
    if 1==2: 
     def f(self): 
      print "the world has gone mad" 
    else: 
     def f(self): 
      print "sanity rules" 

>>> a = A() 
>>> a.f() 
sanity rules 
>>> 

- 오히려 unpythonic 느낀다.

다른 사람들은 메타 클래스, 상속 및 클래스 데코레이터를 비롯한 클래스의 동작을 수정하는 많은 방법이 있음을 지적했습니다.

0

파이썬이 해석되므로 파이썬 모듈을 가져 오면 모듈 수준의 모든 클래스 코드가 해당 클래스의 메타 클래스와 함께 실행됩니다. 따라서 클래스가 존재하게됩니다.

C++가 컴파일되었습니다. 클래스를 가져올 때 클래스가 이미 존재합니다. 그것들이 이미 생성되었을 때 생성되는 방법을 제어 할 수있는 방법이 없습니다.

관련 문제