如何将基于函数的数据管道转换为 OOP?

我正在做一些数据处理,并构建了多个管道,每个管道都包含多个函数,这些函数在每个步骤中广泛修改字典。由于不同的管道对相同的数据进行操作并具有相似的功能,因此我一直在尝试将其转换为更面向 OOP 的结构。然而,在我开始之前,我已经把自己稍微打结了。


采取以下简化示例:


for f in foos:

    y = extract_y_info(f)

    z = extract_z_info(f)

    *some code that does something with y and z*

    

def extract_y_info(f):

    return *some code that extracts y info from f*


def extract_z_info(f):

    return *some code that extracts z info from f*

对我来说,似乎有几种方法可以将其转移到 OOP 结构。第一个与逐个功能的方法非常相似。


class foo():

    def __init__(self, x):

        self.x = x


    def extract_y_info(self):

        return *some code that extracts y info from self.x*


    def extract_z_info(self):

        return *some code that extracts z info from self.x*


for f in foo_instances:

    y = b.extract_y_info()

    z = b.extract_z_info()

    *some code that does something with y and z*

另一个选项是修改类的实例:


class foo():

    def __init__(self, x):

        self.x = x


    def extract_y_info(self):

        self.y = *some code that extracts y info from self.x*


    def extract_z_info(self):

        self.z = *some code that extracts z info from self.x*


for f in foo_instances:

    f.extract_y_info()

    f.extract_z_info()

    *some code that does something with f.y and f.z*

这些选项中的任何一个是否比另一个更好?还有更好的第三种方法吗?


慕森王
浏览 74回答 1
1回答

青春有我

这实际上取决于您的总体设计是什么,以及您期望实例在任何给定时间处于什么状态以及您对它的处理方式(换句话说,属性本身的存在是否有意义,但是......前者似乎通常更y安全我。你调用并获得一个值,你不必跟踪,我是否调用了该方法以及这个或那个属性处于什么状态?但请注意,你应该真正在构造函数中定义实例属性,否则访问可能不仅令人惊讶,而且是致命的(AttributeError)。现在,解决上述一些问题并且可能适合您在此处访问值的操作的简洁解决方案可能是 property ,它本质上允许您访问方法返回的值,就好像它是实例属性一样:class foo():    def __init__(self, x):        self.x = x    def extract_y_info(self):        return #some code that extracts y info from self.x    y = property(extract_y_info)     for f in foo_instances:    print(f"value of f.y = {f.y}")property或者您可以使用方法装饰器执行相同的操作:    @property    def y(self):        return #some code that extracts y info from self.x如果获取y成本昂贵且其值在实例的整个生命周期内不会改变,从 Python 3.8 开始,您还可以使用cached_property.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python