2017-11-26 9 views
0

클래스 Foo을 반 복하지 않고 __init__에서 classmethod addInstances을 호출하고 싶습니다.클래스 이름을 반복하지 않고 __init__에서 classmethod를 호출하십시오.

class Foo(): 
    myInstances = {} 

    @classmethod 
    def addInstance(cls, name, obj): 
     cls.myInstances[name]=obj 

    def __init__(self, name): 
     Foo.addInstance(name, self) # class name "Foo" is repeated 

#use the class 
if __name__ == "__main__": 
    Foo('testName') 
    print(Foo.myInstances) 

위의 코드는 내가 기대하는 바를 수행합니다. 그러나 "Foo"이 반복됩니다.

cls.addInstance(name, self) 

있는 라인

Foo.addInstance(name, self) # class name "Foo" is repeated 

교체는 NameError: name 'cls' is not defined 리드.

+0

당신은'self.addInstances를 호출 할 수 있습니다'그' – Vinny

답변

1

만큼 당신이 addInstance

self.addInstance 

도 작동합니다 같은 간단한 메소드를 오버라이드 (override)하지 않는 한. 표준 C++ , 달리 -

CLS자기은 규칙입니다. 명시 적 그들에게 를 통과해야 이유

- classmethods 및 방법에 각각

당신은 또한 (..)

self.__class__.addInstance 
+0

주를 쓸 수 있습니다 self.__ class____ addInstance'는'self.addInstance'와 약간 다릅니다. 왜냐하면 전자는 서브 클래스에서 오버라이드 된 메소드가 호출되는 것을 허용하지 않기 때문입니다. 원하는 것을 수행하는 양식을 사용하십시오. 여기서 문제는 관습 중 하나가 아니라,'addInstance'라는 * instance * 속성이 없다면, 파이썬은 MRO를 사용하여 그 이름으로 클래스 속성을 찾으려고합니다. – chepner

+0

@chepner, 분명합니다. _self_ :-)를 통해 클래스 메소드에 액세스 할 때 죄책감을 극복하기 위해 OP를 돕습니다. – volcano