2017-01-03 4 views
0

나는 (더 정기적 function 같은) 이런 식으로 내 class을 구축하기 시작했습니다파이썬 클래스 - 체인 인스턴스 메소드

ex 1

class Child(Parent): 

    def __init__(self,user): 
     Parent.__init__(self, user)  

     search = api.search() 
     filter = api.filter(search) 
     output = api.output(filter) 

     return output 

이런 식으로 내가 실행할 수 있습니다 :

movies = Child('John') 

그리고 최종 결과물을 얻으십시오.

그럼, 데이터를보다 효율적으로 제어 할 수하기 위해 instance methods로 내 global api methods 부러 :

ex 2

class Child(Parent): 

    def __init__(self,user): 
     Parent.__init__(self, user)  

    def search_api(self): 
     search = api.search() 
     return search  

    def filter_api(self, search): 
     filter = api.filter(search) 
     return filter 

    def output(self, filter): 
     output = api.output(filter) 
     return output 

을 지금은 최종 출력을 얻기 위해, 다른 경우에 그것을 깰해야합니다 :

test = Child('John') 
search = test.search_api() 
filter = test.filter_api(search) 
out = test.output(filter) 

print (out) 

이 있습니까 체인의 모든날 수있는 decorator 또는 ex2을 한 번에 실행할 수 있습니까 (인스턴스화)?

+0

당신은'의미 test.output (test.filter_api (test.search_api를()))'? – chepner

+0

'ex2'에서 어떻게 여러분의 메서드에서 인자를 사용하지 않습니까? 나는 그것이 당신이 원했던 것을 당신이 원하는대로 할 것이라고 상상할 수 없습니다. –

+0

이것은 의미가 없습니다.당신의'__init__'은 수퍼 클래스보다 아무것도 수행하지 않기 때문에 불필요합니다. 그리고 메소드 중 어느 것도'self'를 사용하지 않으므로, 그들은 완벽하게 정상적인 함수가 될 수 있습니다. – RemcoGerlich

답변

1

마법의 물건에 대한 필요가 없습니다 당신이 기능을 사용하면 구현해야 호출과 같은 오브젝트가 동작하도록해야하는 경우 대신 생성자 :

class Child(Parent): 

    def __init__(self,user): 
     Parent.__init__(self, user) 
     self.myuser = user 


    def search_api(self): 
     search = api.search() 
     return search  

    def filter_api(self, search): 
     filter = api.filter() 
     return filter 

    def output(self, filter): 
     return output 

    def __call__(self,user): 
     search = self.search_api() 
     filter = self.filter_api(search) 
     return self.output(filter) 

을 모든 것을 포장의 __call__ 그리고 지금 당신이 할 수 있습니다

a = Child('Joe') 
print(a()) 
+0

'TypeError : __init __()는 None을 반환해야합니다. ' – RemcoGerlich

+0

그래, 내 답변을 검토하지 않고 올리면받을 수 있습니다. 답변을 편집했습니다. 감사합니다 @ RencoGerlich – yorodm

+0

모든 대답은 유효했지만 이것이 가장 단순하다고 생각합니다. –

2

나는 당신이 나중에 작성자 패턴이라고 생각하여 output = Search().filter().get_output() 또는 그와 비슷한 것을 작성할 수 있습니다. 이를 위해

는 모든 "중간"방법에서 빌더 객체를 반환해야 작동합니다 :

class Search(object): 
    def __init__(self, *args, **kwargs): 
     # apply args, kwargs 

    def filter(self, *args, **kwargs): 
     # apply args, kwargs 
     self.filters.append(...) 
     return self 

    def paginate(self, *args, **kwargs): 
     # apply args, kwargs 
     self.pagination = ... 
     return self 

    def get_output(self, *args, **kwargs): 
     # apply args, kwargs 
     # build the search, find output ... 
     return output 
1

일부 도우미는 컴파일로 만들려면 :

movies = Child('John').process() 
1

당신은 __call__()를 사용할 수 있습니다

class Child(Parent): 

    def __init__(self, user): 
     super().__init__(user)  

    def search_api(self): 
     search = api.search() 
     return search  

    def filter_api(self, search): 
     filter = api.filter() 
     return filter 

    def output(self, filter): 
     return api.output 

    def process(self): 
     res = self.search_api() 
     res = self.filter_api(res) 
     return self.output(res) 

당신이 한 줄을 모두 수행 할 수 있습니다

class API: 
    def __getattr__(self, attr): 
     return API() 
    def __call__(self, x=1): 
     return 42 

api = API() 

class Parent(object): 
    def __init__(self, user): 
     self.user = user 

process 방법의 모든 단계를 수행 . 나는 그것이 동일하지 알고 있지만, 아마도 그것은 당신의 ex2보다 더 수 있습니다 : 다음

class Child(Parent): 

    def __init__(self, user): 
     Parent.__init__(self, user) 

    def search_api(self): 
     search = api.search() 
     return search  

    def filter_api(self, search): 
     filter = api.filter(search) 
     return filter 

    def output(self, filter): 
     output = api.output(filter) 
     return output 

    def __call__(self): 
     search = self.search_api() 
     filter = self.filter_api(search) 
     return self.output(filter) 

, 당신은 할 수 있습니다 :

c = Child("john") 
output = c() 
관련 문제