【问题标题】:create chain methods for class in python [duplicate]在python中为类创建链方法[重复]
【发布时间】:2020-08-14 00:26:10
【问题描述】:

假设我有以下课程:

class MyClass: 
    def __init__(self, text):
        self.text = text

    def strip(self):
        strip_text = self.text.strip()

        return strip_text

    def reverse(self):
        rev_text = self.text.strip()[::-1]

        return rev_text

my_name = MyClass('todd ')

我希望能够像这样调用这个类的方法:

my_name.strip().reverse()

但是,当我这样做时,它会引发错误。我该如何进行链接方法?

【问题讨论】:

  • 你需要返回 self 以便能够链接操作,所以不要返回 strip_text,而是设置 self.strip_text = strip_text 并返回 self
  • 这称为流利的界面。在 Python 中并不常见,尽管一些第三方库使用它。见this
  • 它会抛出一个错误看到错误将有助于追查问题。
  • 这能回答你的问题吗? Purpose of return self python
  • my_name.strip() 返回一个普通字符串,它没有.reverse() 方法。

标签: python


【解决方案1】:

my_name.strip() 返回一个String,它没有reverse() 函数。

一种快速的方法就是将my_name.strip() 设为一个新的 Class 对象,然后将其反转:

MyClass(my_name.strip()).reverse()

(但是,IMO 这很笨拙,在类定义本身中有一种更好(更 Pythonic)的方法来解决这个问题。)

【讨论】:

    【解决方案2】:

    每个函数都必须替换包装的字符串,然后返回self。在链的结束,您检索最终结果。

    class MyClass: 
        def __init__(self, text):
            self.text = text
    
        def strip(self):
            self.text = self.text.strip()
    
            return self
    
        def reverse(self):
            self.text = self.text.strip()[::-1]
    
            return self
    
    
    my_name.strip().reverse().text
    

    作为改变现有对象的替代方法,可以在每一步返回一个新实例。

    class MyClass: 
        def __init__(self, text):
            self.text = text
    
        def strip(self):
            return MyClass(self.text.strip())
    
        def reverse(self):
            return MyClass(self.text.strip()[::-1])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2018-08-15
      相关资源
      最近更新 更多