2017-03-14 8 views
0

파이썬 클래스에서 정의되지 않은 메서드 또는 특성 호출을 처리하고 싶습니다. method가없는 경우 어떤 작업을 수행해야합니다. 여기 예제에서는 몇 가지 메소드와 호출을 작성했습니다.정의되지 않은 메서드에 액세스

클래스에서 호출이 정의되어 있지 않으면 __getattr__으로 이동하고 "get_ {the_called_method_or_attribute}"이름의 메소드가 있는지 확인하고 싶습니다. 메서드가 있으면 해당 값을 반환합니다.

나는 dir, self__dict__ 및 기타를 사용하려고 시도했지만 아무 것도 작동하지 않았습니다. 그냥 재귀에서 자신을 호출했습니다.

클래스 내부의 호출 섹션에서 메서드 또는 특성의 존재 여부를 확인하지 않아도 내 쿼리를 수행 할 수 있습니까?

class C: 

    def __init__(self, data): 
     self.data = data 

    def get_name(self): 
     return "{f_name} {l_name}".format(**self.data) 

    def get_f_name(self): 
     return data.get("f_name") 

    def get_l_name(self): 
     return data.get("l_name") 

    def get_email(self): 
     return data.get("email") 

    def access_undefined_methods(self, key): 
     return self.data.get(key, "Key '{}' does not present".format(key)) 

    def __getattr__(self, name): 
     return self.access_undefined_methods(name) 

data = {"f_name": "John", "l_name": "Doe", "email": "[email protected]"} 
obj = C(data) 
print obj.get_name() # <-- John Doe 
print obj.f_name  # <-- John 
print obj.l_name  # <-- Doe 
print obj.email   # <-- [email protected] 
print obj.name   # <-- this should execute obj.get_name() 
+0

이유를 설명 할 수 있습니까? 나는 이것이 [XY 문제] (https://meta.stackexchange.com/a/66378/344593)라고 의심한다. – TemporalWolf

+0

나는 그렇게하기에는 너무 많은 마법이 있다고 생각한다. 당신이 원하는 것을 설명해 주시겠습니까? 대체 솔루션이있을 수도 있습니다. – nir0s

+0

실제로 해결해야 할 문제는 없습니다. 나는 그것이 가능한지 알고 싶었습니다. 통화 시간 중에 방법의 존재를 확인했다면 가능할 것입니다. 그러나이 코드 설정으로 나는 그렇게 할 수 없었다. 그래서 여기에 질문을했습니다. 내 질문은 여전히 ​​가능합니까? –

답변

0

당신은 get_XXX 방법은 객체의 메소드의 사전을 얻기 위해 dir() 기능을 사용하여 존재하는지 여부를 확인할 수 있습니다.

def access_undefined_methods(self, name): 
    if 'get_' + name in dir(self): 
     return dir(self)['get_' + name'])(self) 
    else: 
     return "Key '{}' does not present".format(key) 
+0

코드를 사용해 보셨습니까? 아니면 내 질문을 읽었 니? 나는'dir '을 사용하는 것이 효과적이지 않다고 말했다. 출력은 입니다. __getattr__에서'''File "test.py"78 행을 반환합니다. return self.access_undefined_methods (name) access_undefined_methods에 "test.py"파일 7235 줄 12.'get_'+ 이름이 dir 인 경우 자기) : 파일 "test.py", 줄 78, __getattr__ 반환 self.access_undefined_methods (이름) 파일 "test.py", 라인 (72), access_undefined_methods 의 경우 'get_'디렉토리 (자체에서 + 이름) : RuntimeError : Python 개체 '''를 호출하는 동안 최대 재귀 깊이 초과했습니다. –