繁体   English   中英

python中的链接实例方法

[英]Chaining instance methods in 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

请帮助我,我不知道该怎么办。

谢谢

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

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

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

其中playlist不是foo对象(即foo.do_something()不应有任何意义,而应该引发错误),而是不同类的实例。

如果确实如此,那么您实际上需要两个类:具有返回Playlist对象的playlist(...)方法的Foo和具有add()delete()方法的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM