2017-01-03 49 views
0

我开始建立我class以这种方式(更像是一个普通function):Python类 - 链的实例方法

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') 

并得到我的最终输出。

然后,我打破了我global api methodsinstance 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) 

是否有decoratorbuilt-in method,让我到链上的所有instance methods这样ex2可以一次运行(实例化)?

+0

你的意思是'test.output(test.filter_api(test.search_api ()))'? – chepner

+0

如何在'ex2'中使用方法中的参数?我无法想象在这种情况下它会做你想要的。 –

+0

这没有任何意义。你的'__init__'是多余的,因为它没有超过超类的作用,并且没有任何方法使用'self',所以它们可能完全是正常的函数。 – RemcoGerlich

回答

1

无需神奇的东西,如果你需要对象的行为像函数调用,应实现__call__,而不是只在构造函数:

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) 

包装的一切,现在你可以:

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

一些助手,使其编译:

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方法的所有步骤:

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) 

允许你做的一切在同一行:

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

您可以使用__call__() 。我知道这是不一样的,但也许它可能比你更好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()