2017-10-26 13 views
-1

나는 공통 데이터 구조 내에서 비교되고 정렬 될 수있는 클래스를 만들었습니다.클래스 초기화 메소드를 사용하는 파이썬 클래스 상수?

클래스에서 취할 수있는 최대 값과 최소값에 대해 두 개의 클래스 상수를 만들고 싶었습니다. 그래서 난 그냥 MyClass에 가져 오기 및

obj = MyClass.MY_MAX_CONSTANT 

것은이 생성자 또는 이러한 상수를 초기화 초기화 메소드를 호출하는 것은 허용되지 않습니다 있는지를 쓰고이 값을 호출 할 수 있습니다.

자바에서는 정적으로 선언되어 작동하지만, 생성자/초기화 메소드를 사용하여 Python에서 클래스/정적 상수를 어떻게 수행 할 수 있는지 알 수 없습니다. 검색 기능이 많지 않지만 상수에 대한 일반적인 요리법 및 속성을 만들기위한 제안을 찾지 못했습니다.

필자는 확실히 변경하지 않기 때문에 상수 값을 변경하지 않는 메커니즘이 필요하지 않습니다. 각 상수에 대한 몇 가지 기능을 사용하여,

class MyClass(object): 
    MY_MAX_CONSTANT = MyClass(10,10) 
    MY_MIN_CONSTANT = MyClass(0,0) 

    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
     # We imagine some initialization work here 
     self.x = param1 
     self.y = param2 


    # SORT FUNCTIONS 
    def __cmp__(self, other): 
     # Implementation already made here 

    def __eq__(self, other): 
     # Implementation already made here 

    def __ne__(self, other): 
     # Implementation already made here 

    def __ge__(self, other): 
     # Implementation already made here 

    # And so on... 

두 번째 시도 :

내 첫 번째 시도였다

class MyClass(object): 
    def __init__(self, param1, param2): # Not the exact signature, but I think this works as an example 
     # We imagine some initialization work here 
     self.x = param1 
     self.y = param2 
     MY_MAX_CONSTANT = None 
     MY_MIN_CONSTANT = None 

    @staticmethod 
    def get_max(self): 
     if not MyClass.MY_MAX_CONSTANT: 
      MyClass.MY_MAX_CONSTANT = MyClass(10,10) 
     return MyClass.MY_MAX_CONSTANT 

    @staticmethod 
    def get_min(self): 
     if not MyClass.MY_MIN_CONSTANT: 
      MyClass.MY_MIN_CONSTANT = MyClass(0,0) 
     return MyClass.MY_MIN_CONSTANT  

    # SORT FUNCTIONS (I'm not writing them twice for spacing) 

하지만 두 상수를 만들기위한 이상한 기능 메커니즘을 방지하기 위해 원했다.

내게 더 자연 스럽기 때문에 모듈에없는 상수를 선호하지만 조언이나 제안을 듣고 있습니다. 누구든지 나를 더 나은 pythonic 솔루션을 가리킬 수 있습니까?

감사

+2

"문제는 생성자 또는 init 메서드를 호출하여 이러한 상수를 초기화 할 수 없다는 것입니다." - 누가 그걸 허락하지 않니? 너의 선생님? 파이썬은 그것을 허용하지만 클래스가 실제로 존재하면 상수를 생성해야합니다. 클래스 문 본문에는 아직 존재하지 않습니다. – user2357112

+0

어디서 상수를 정의해야합니까? init은 나에게 재귀 적으로 호출하기 좋은 곳처럼 보이지 않는다. – madtyn

답변

2

클래스를 생성 후 상수를 추가, 당신은 더 클래스를 추가 할 수 있습니다 속성을 다음 class 문이 실행을 완료 만

class MyClass: # ... MyClass.MY_MAX_CONSTANT = MyClass(10, 10) MyClass.MY_MIN_CONSTANT = MyClass(0, 0) 

바운드, 클래스 객체로 볼 수 있습니다 MyClass이라는 이름으로 이 시점 이전에는 인스턴스를 만들 수 없습니다.

+0

감사합니다. 이 작동합니다. 내 단 하나의 의심은 이제 수업을 가져올 때 어떻게 가져 오기 문장이 작동하는지입니다. MyClass와 관련된 모든 것을 올바른 모듈에서 가져옵니다. 파이썬은 가져 오기를 멈출 때를 어떻게 알 수 있습니까? 내가 어떻게 알아? (클래스 가져 오기가 선언 아래에 들여 쓰여진 내용 만 가져 왔다고 생각할 때까지) – madtyn

+1

가져 오기는 처음 모듈에서 모든 최상위 코드를 실행합니다. 나머지는 객체에 이름을 바인딩하는 것입니다. 'sys.modules [ 'modulename']'은 중앙 모듈 객체이며 거기에서 가져올 수있는 다양한 특정 이름에 이름을 붙이거나 모듈 객체 자체에 대한 참조 만 가져옵니다. 그래서 모든 것이 기억 속에 존재할 것입니다. –