Python class 方法链接
Python class methods chaining
我确实有 class:
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()
?
是否可以以某种方式链接这些方法并解决使用此方法链传递参数(数据)的问题?
这些不是 class 方法,它们是实例方法。对于方法链,每个方法 return 都是一个实现链中下一个方法的对象。由于您的所有方法都是 BaseModel
的实例方法,因此您需要 return BaseModel
(或其后代)的实例。这显然意味着你不能 return 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
对于实例方法和 class 方法之间的区别,this answer 给出了一个很好的概述。
这些是实例方法,不是 class 方法。
您这里似乎混合了两种对象类型。您需要回答的第一个问题是 class 是否有状态。如果它是有状态的,那么您的数据通常是对象本身的一部分,在这种情况下,方法链接非常简单。你只是 return 从你的方法和链中自我。
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()))
我也觉得这很难读,但这就是无状态的方式
我个人觉得在各自的行中调用每个方法更具可读性
我确实有 class:
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()
?
是否可以以某种方式链接这些方法并解决使用此方法链传递参数(数据)的问题?
这些不是 class 方法,它们是实例方法。对于方法链,每个方法 return 都是一个实现链中下一个方法的对象。由于您的所有方法都是 BaseModel
的实例方法,因此您需要 return BaseModel
(或其后代)的实例。这显然意味着你不能 return 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
对于实例方法和 class 方法之间的区别,this answer 给出了一个很好的概述。
这些是实例方法,不是 class 方法。
您这里似乎混合了两种对象类型。您需要回答的第一个问题是 class 是否有状态。如果它是有状态的,那么您的数据通常是对象本身的一部分,在这种情况下,方法链接非常简单。你只是 return 从你的方法和链中自我。
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()))
我也觉得这很难读,但这就是无状态的方式
我个人觉得在各自的行中调用每个方法更具可读性