2012-07-28 6 views
1

staticmethod가 속한 클래스의 이름을 찾는 방법이 있습니까?staticmethod : 클래스 이름을 가져 옵니까?

classmethod를 들어
class A(object): 
    @staticmethod 
    def my_staticmethod(): 
     return 'static' 

    @classmethod 
    def my_classmethod(): 
     return 'classmethod' 


In [2]: A.my_staticmethod 
Out[2]: <function utils.my_staticmethod> 

In [3]: A.my_classmethod 
Out[3]: <bound method type.my_classmethod of <class 'utils.A'>> 
In [4]: A.my_classmethod.im_self.__name__ 
Out[4]: 'A' 

, 나는 A.my_classmethod.im_self.__name__를 통해 클래스의 이름을 얻을 수 있지만 나는 StaticMethod를 위해 그것을 알아낼 수 없었다.

아이디어가 있으십니까? 감사합니다. .


글쎄, 실제로 여기 내가하려는 일이 있습니다. function/classmethod/staticmethod를 "serialize/deserialize"하는 두 개의 함수를 만들려고합니다.

즉 누군가가 serialize 함수에 함수를 전달하고 문자열을 가져올 수 있습니다.

# later on... 
f = deserialize(a_string) 
# I can use my function 
f(...) 

나는 그것이 작동되도록 수 :

a_string = serialize(A.my_classmethod) 

이 문자열은 다음 예를 들어 DB .. 에 저장할 수 있습니다,이 문자열은 호출 할 수있는 기능을 해결하기 위해 충분해야한다 함수 나 클래스 메쏘드에 대해서는 정적 메쏘드가 아니고 getattr을 사용하는 클래스를 알아낼 수 없으므로 static 메쏘드가 아닙니다. ...

+0

가능한 복제본 [파이썬에서 정적 메서드 내에서 클래스 이름을 얻는 방법] (http://stackoverflow.com/questions/4691925/in-python-how-to-get-name-of-a- static-method-class-inside-its-static-method) – BrenBarn

+0

기본적으로 staticmethod의 전체적인 점은 클래스에 대한 연결이 없다는 것입니다. 클래스가 어떤 클래스인지 알고 싶으면 정적 메서드를 사용하지 마십시오. – BrenBarn

+0

도 여기에 복사 : http://stackoverflow.com/questions/949259/how-do-i-infer-the-class-to-which-a-staticmethod-belongs – gnr

답변

0

"부두"를 사용하면 효과적 일 수 있습니다. 데이터 모델을 우회하는 것 - 그리고 그게 무엇에 좋은가? 클래스 메소드를 원하면 클래스 메소드를 사용하십시오. 그들이 상호 교환 할 수 있다면, 그들은 다르지 않을 것입니다!

또한 :

@classmethod 
def my_classmethod(): 
    return 'classmethod' 

정말해야한다 : 당신을

def serialize(cls, function): 
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__) 

과 :

직렬화/역 직렬화에 대한 의견에 대한 응답으로
@classmethod 
def my_classmethod(cls): # assuming no args 
    return cls.__name__ # instead of A.my_classmethod.im_self.__name__ 
+0

사실, 클래스 메쏘드가 무엇을할지 모르겠다. 클래스의 이름을 반환하는 메소드를 찾지 않았다.두 번째 게시물을보고 내가 실제로 의미했던 것을 확인하십시오. 고마워. – Michael

+0

두 가지 질문에 대한 답변 : 1) 원래 질문이 아닌 이유는 무엇입니까?> 정적 메서드를 알기 위해 클래스 이름을 얻는 것이 나는 통과하려는로드 블록에 대해 묻는 것보다 간단한 질문을하고 싶었습니다. 2) 모든 사람들이 나쁜 생각이라고 말하면서, 흑 마술로 할 수는 있겠지만 여전히 일을 제대로하는 방법이라고 생각하십니까? => Django 신호를 사용하고 있고 DB에 신호를 연결 한 상태에서 수신기를 계속 사용하고 싶었 기 때문에 함수를 직렬화/역 직렬화 할 수 있기를 원했습니다 (정적 메서드 일지라도). 희망은 지금 이해가 되네. – Michael

0

, 당신은 인터페이스를 변경할 수 있습니다 모든 모듈 수준 기능에 sys.modules[__name__].__name__을 사용할 수 있습니다.

비 직렬화의 경우 inspect.classify_class_attrs(cls)이 유용 할 수 있습니다.

+0

자, 클래스 자체를 전달하지 않고 staticmethod에서 클래스 이름에 액세스 할 수있는 방법이 없다고 결론을 맺습니다. 먼저 함수가 무엇이든 동일한 유스 케이스 (함수 만 전달)를 원했습니다. 음, staticmethod를 전달하지 말고 staticmethods가 작동하지 않는다는 의사를 써야합니다. 감사. – Michael

관련 문제