【问题标题】:Chaining instance methods in python在python中链接实例方法
【发布时间】:2023-03-13 11:05:01
【问题描述】:

我想用方法和子方法在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

请帮帮我,我不知道该怎么做。

谢谢

【问题讨论】:

  • @MosesKoledoye 我认为我们应该选择另一个在你的维基百科链接中表达这个概念的骗子,而不是硬生生的内置插件。
  • @cᴏʟᴅsᴘᴇᴇᴅ 添加

标签: python python-3.x chaining method-chaining


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果我理解正确,foo.playlist('someplaylist').do_something() 实际上应该是一个快捷方式

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

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

    如果确实如此,您实际上需要两个类:Fooplaylist(...) 方法返回 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多