2017-08-24 8 views
0

Je voudrais créer une classe en python avec la méthode et la sous-méthode.Méthodes d'instance de chaînage en python

exemple ce que je veux faire:

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

J'ai ce code pour l'instant:

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

S'il vous plaît aidez-moi, je ne sais pas comment je peux le faire.

Merci

+1

https://en.wikipedia.org/ wiki/Method_chaining –

+0

@MosesKoledoye Je pense que nous devrions choisir une autre dupe qui exprime le concept dans votre lien wikipedia plutôt que des builtins. –

+1

@ cᴏʟᴅsᴘᴇᴇᴅ Ajouté –

Répondre

2

IIUC, vous voulez la méthode de la chaîne appelle un après l'autre? Tout ce que vous avez à faire est de retourner self à la fin de chaque fonction.

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

Si je comprends bien, foo.playlist('someplaylist').do_something() devrait en fait être un raccourci pour

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

playlist est pas un objet foo (ie: foo.do_something() n'est pas censé avoir un sens et devrait juste soulever une erreur) mais une instance d'une classe distincte.

Si tel est bien le cas, vous voulez en fait deux classes: Foo avec la méthode playlist(...) qui retourne un objet Playlist et Playlist avec add() et delete() méthodes:

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)