2017-08-24 61 views
0

我想用方法和子方法在python中创建一个类。在python中链接实例方法

例子就是我想做的事:

foo = Foo() 
foo.playlist('my playlist').add('i_add_a_track_in_"my playlist".ogg') 
foo.playlist('my playlist').delete('i_remove_this_track.ogg') 

我有这样的代码现在:

class Foo(object): 
    def playlist(self, name): 
     pass #my function... 
    def add(self, track): 
     pass #adding track 
    def delete(self, track): 
     pass #delete track 

请帮助我,我不知道我能做到这一点。

谢谢

+1

https://en.wikipedia.org/维基/ Method_chaining –

+0

@MosesKoledoye我认为我们应该选择另一个表达维基百科链接中的概念而不是使用shoehorning builtins的概念。 –

+1

@cᴏʟᴅsᴘᴇᴇᴅ新增 –

回答

2

IIUC,你想链法的呼声此起彼伏?您只需在每个函数结束时返回self即可。

class Foo(object): 
    ... 
    def playlist(self, name): 
     ... 
     return self 

    ... # and so on 

MVCE:

In [229]: class Foo: 
    ...:  def __init__(self, data): 
    ...:   self.data = data 
    ...: 
    ...:  def add(self, val): 
    ...:   self.data += val 
    ...:   return self 
    ...: 
    ...:  def sub(self, val): 
    ...:   self.data -= val 
    ...:   return self 
    ...:  

In [231]: x = Foo(0) 

In [232]: x = x.add(10).sub(5) # or just x.add(10).sub(5) 

In [233]: x.data 
Out[233]: 5 
1

如果我理解正确的话,foo.playlist('someplaylist').do_something()实际上应该是

playlist = foo('someplaylist') 
playlist.do_something() 

一个快捷方式,其中playlist不是一个foo对象(即:foo.do_something()是不应该有道理,应该只是提出一个错误),而是一个独特类的实例。

如果是这样的情况确实如此,你真正想要两类:Foo与方法playlist(...)返回一个Playlist对象,Playlistadd()delete()方法:

class Playlist(object): 
    def __init__(self, name): 
     self.name = name 

    def add(self, what): 
     print("adding {} to playlist {}".format(what, self.name)) 

    def delete(self, what): 
     print("deleting {} from playlist {}".format(what, self.name)) 


class Foo(object): 
    def playlist(self, name): 
     return Playlist(name)