2017-08-24 3 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/ wiki/Method_chaining –

+0

@MosesKoledoye私は、ウィキペディアのリンクでコンセプトを表現する別のデュープを選択する必要があると思います。 –

+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()が実際に

playlistfooオブジェクト(すなわちではありません
playlist = foo('someplaylist') 
playlist.do_something() 

のショートカットのようになります。foo.do_something()がに想定されていません何らかの意味を持ち、エラーを起こすだけでよい)、別個のクラスのインスタンスです。それは確かにケースの場合

は、あなたが実際に2つのクラスをしたい:add()delete()方法でPlaylistオブジェクトを返すメソッドplaylist(...)Foo、およびPlaylist

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) 
関連する問題