2011-12-14 8 views
5

클래스에 대한 정보를 클래스 (정적) 변수로 저장하고 싶습니다. 그러나, 나는 이러한 것들이 초기화되는 방법을 알아낼 수 없습니다. 다음은 기본적인 멍청한 예입니다 :Python 클래스 변수 초기화

함수가 호출되었으므로 (print 문이 작동 됨) 왜 클래스 변수를 변경하지 않았습니까? 클래스 정의가 완료된 후 메타 캐라스를 사용하지 않으려면 메타 클래스를 사용해야합니까?

[구체적으로는 clsMeth을 꾸미기로 지정하고 클래스 변수를 이렇게 장식 된 모든 기능의 목록으로 지정합니다. 나는 이것을 달성하는 올바른 방법이 아닌 것 같아서 계속 전진했지만 여전히 궁금하다.]

편집 : 많은 사람들이 지적했듯이 위의 코드는 ' 실행. A.clsMeth()에 대한 호출이 A의 이전 버전을 참조하고 실행하는 IPython 세션에서 실행했습니다. 그러한 것은 해석 된 언어를 사용할 때의 위험입니다. 나는 이런 식으로 뭔가에가는 결국 :

outsideDict = {} 
def outsideDec(func): 
    outsideDict[func.__name__] = func 

class A(object): 
    @outsideDec 
    def someMethod(self): 
     print 'ID %s' % id(self) 

    def otherMethod(self): 
     print 'other' 

print outsideDict 
one, two = A(), A() 
outsideDict['someMethod'](one) 
outsideDict['someMethod'](two) 

는 아마도 이것은 또 다른 질문을해야하지만, outsideDec 실행됩니다 때, 그것은 인수의 구성원 무엇 클래스 말할 수있는 방법은 무엇입니까? 아니면 파이썬에서 이와 같은 인트로 스펙 션을하는 더 좋은 방법이 있을까요? 나는 여기서 나가서 대답을 받아들이고 더 많은 연구를 할 것입니다. 모두에게 감사드립니다!

+0

'A'가 정의되지 않았기 때문에'A.clsMeth'를 호출 할 때 오류가 있습니다. 어쩌면 당신은 통역사를 사용하고 있으며 오래된 'A' 정의가 있습니까? – jcollado

+0

이 샘플을 어떻게 실행합니까? 구문이 올바르지 않으므로이 작업을 수행 할 수 없습니다. 'A.clsMth()'는 클래스 정의 안에 이와 같이 배치 할 수 없습니다. – gecco

+0

@gecco : 가능합니다. 구문은 괜찮습니다. A.clsMeth()가 호출되었을 때'A'에 대한 할당이 이루어지지 않았기 때문에, jcollado가 언급했듯이, 런타임 오류로 실패 할 것입니다.하지만 그것을 할 수 있습니다. –

답변

4

A으로 실행되지 않습니다 A의 정의에 A.clsMeth()에 대한 호출은, 그 시점에서 존재하지 않습니다

A가 (예를 들어, 만약 이전에 정의 된 경우 코드가 작동하는 듯 수도

>>> class A(object): 
...  clsVar = 'a' 
...  @classmethod 
...  def clsMeth(cls): 
...   print 'changing clsVar' 
...   cls.clsVar = 'b' 
...  A.clsMeth() 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in A 
NameError: name 'A' is not defined 
당신은 REPL에서 그것을 테스트하고 있었다). 그러나 A.clsMeth에 대한 호출은 새로운 클래스에 의해 숨겨진 오래된 클래스에서 호출되었을 것이다. '물론

>>> class A(object): 
...  clsVar = 'a' 
...  @classmethod 
...  def clsMeth(cls): 
...   print 'changing clsVar' 
...   cls.clsVar = 'b' 
... 
>>> A.clsMeth() 
changing clsVar 
>>> A.clsVar 
'b' 

, fabianhrj가 언급 한 바와 같이, 당신은뿐만 아니라 생성자에 넣어 수 있지만 원 :

그러나, 우리는 확실히 정의 후 그 통화를 보류하고 원하는 결과를 얻을 수 있습니다 인스턴스를 만들 때까지 호출되지 않습니다.

0

작동하려면 모든 명령문을 함수에 넣어야합니다. 객체가 생성 될 때 무언가를 실행하고 싶다면 생성자에 넣어 두는 것이 좋습니다.

class A: 
    def clsMeth(self): 
     print("Changing clsVar") 
     self.clsVar = 'b' 
    def __init__(self): 
     self.clsMeth() 
    clsVar = 'a' 

여기 있습니다.

+0

'__new__' 또는'__init__'을 의미합니까? – kennytm

+0

예, 문맥을 파이썬으로 전환하겠습니다. –

+0

확인이 수정되었습니다. 확인해 주시겠습니까? –

관련 문제