2014-12-18 2 views
1

@classmethod을 사용하고 싶지만 인스턴스의 네임 스페이스를 오염시키고 싶지 않습니다. 클래스 메서드 for_classes_only이있는 경우 인스턴스를 가져 오지 못하게하려면 어떻게해야합니까?인스턴스가 파이썬을보고 싶지 않음 @classmethod

class MyThing(object): 
    def __init__(self, this=None): 
     self.this = this 

    @classmethod 
    def for_classes_only(cls): 
     print "I have a class {}".format(cls) 


thing = MyThing(this='that') 

이 중대하다 :

>>> MyThing.for_classes_only() 
I have a class <class '__main__.MyThing'> 

이 성가신 :

>>> thing.for_classes_only 
<bound method type.for_classes_only of <class '__main__.MyThing'>> 
+5

* 클래스의 모든 항목 *은 인스턴스에서 액세스 할 수 있습니다. * live *에는 존재하지 않습니다. 파이썬은 속성이 인스턴스 자체에 존재하지 않을 때 클래스를 봅니다. 인스턴스가 인스턴스를 볼 수 없도록하려면 * 클래스 외부의 함수 *를 사용하십시오. 클래스에 명시 적으로 전달해야하므로 바인딩되지 않습니다. –

+0

그래서 "class method"는 메소드가 클래스를받는 것을 의미하며, 메소드가 클래스에 제한되지는 않습니다. 알았다. – jkmacc

+0

클래스를 숨길 수는 없지만 클래스가 인스턴스화되었는지 여부에 따라 동작이 변경 될 수 있습니다 (예 : '__init__'에 플래그를 설정합니다. – 101

답변

2

사용하여 시도해보십시오 metaclass :

class Meta(type): 
    # There is *NO* @classmethod decorator here 
    def my_class_method(cls): 
     print "I have a class {}".format(cls) 

class MyThing(object): 
    __metaclass__ = Meta 
    def __init__(self, this=None): 
     self.this = this 

대부분의 사람들이 필요 이상으로이 무거운 마법 또는 그러니, 오직 그렇게해라. 당신이 정말로 필요하다고 확신한다면 요. 대부분의 경우 보통 @classmethod으로 충분합니다.

+0

네 말이 맞아, 이건 짜증 난다. 그러나 그것은 일을 끝내게됩니다 :-) 나는 메타 클래스로 일하게됩니다. 그래서 이것은 괜찮습니다. 감사! – jkmacc

관련 문제