【问题标题】:Python class methods chaining [duplicate]Python类方法链接[重复]
【发布时间】:2018-03-05 14:02:59
【问题描述】:

我确实有课:

class BaseModel:

    def __init__(self):
        pass

    def read_data(self):
        df = ...
        return df

    def transform_input(self, df):
        df = ...
        return df

    def execute(self, df):
        df = ...
        return df

    def run(self):
        data = self.read_data()
        data = self.transform_input(data)
        data = self.execute(data)

如何避免这些方法一个接一个地调用?是否可以这样做:

data = self.read_data().transform_input().execute()

是否有可能以某种方式链接这些方法并解决通过该方法链传递参数(数据)的问题?

【问题讨论】:

  • 那些不是类方法,而是实例方法。您可以通过return self轻松实现链接。
  • 这些是类方法,不是吗?抱歉,让我用方法返回的示例数据更新问题

标签: python oop chaining


【解决方案1】:

这些不是类方法,它们是实例方法。对于方法链,每个方法都必须返回一个实现链中下一个方法的对象。由于您的所有方法都是BaseModel 的实例方法,因此您需要返回BaseModel 的实例(或其后代)。这显然意味着您不能返回df(因为大概df 不是BaseClass 的对象)。将其存储在实例中并在链的末尾检索它。

class BaseModel:

    def __init__(self):
        pass

    def read_data(self):
        self.df = ...
        return self

    def transform_input(self):
        self.df = ...
        return self

    def execute(self):
        self.df = ...
        return self

    def run(self):
        data = self.read_data().transform_input().execute().df

对于实例方法和类方法之间的区别,this answer 给出了一个很好的概述。

【讨论】:

  • 感谢您,我一直在努力寻找示例。鉴于这似乎不是最常用的做事方式,我想知道这种逻辑是否被认为是最佳实践,比如说,使用一个类来表示一个文件(对象),然后使用实例方法来做一个一堆转变。想法?
【解决方案2】:

这些是实例方法,而不是类方法。

您似乎在这里混合了两种对象类型。你需要回答的第一个问题是这个类是否是有状态的。如果它是有状态的,那么您的数据通常是对象本身的一部分,在这种情况下,方法链接非常简单。您只需从您的方法中返回 self 并链接。

class BaseModel:

    def __init__(self, data):
        self.data = data

    @classmethod
    def read_data(cls):
        data = #Some data read from somewhere
        return cls(data)

    def transform_input(self):
        #Transform your data
        return self

    def execute(self):
        #Do Something with data
        return self

my_object = BaseModel().transform_input().execute()

我个人不喜欢方法链。

如果您需要无状态对象,那么您不能像在示例中那样链接,但您可以做其他事情。

class BaseModel:

    def __init__(self):
        pass

    def read_data(self):
        data = #Some data read from somewhere
        return data

    def transform_input(self, data):
        #Transform your data
        return data

    def execute(self, data):
        #Do Something with data
        return data

my_object = BaseModel()
data = my_object.execute(my_object.transform_data(my_object.read_data()))

我也觉得这很难阅读,但这就是你如何无状态地做到这一点

我个人认为在单独的行中调用每个方法更具可读性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多