【问题标题】:Class and instance organisation in python3python3中的类和实例组织
【发布时间】:2017-04-09 14:19:29
【问题描述】:

我有一个存储数据帧 (df) 并包含允许过滤所述 df 的方法的类:

class File(object):

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

    def view_ref(self):
        return self.f['REF']

    def filter_ref(self, val):
        ''' Filter REF column for the given val
        '''
        f = self.f[self.f['REF'] == val]
        self.f = f
        return self.f

这种方法的问题是我希望能够在使用 filter_ref() 方法执行过滤后访问原始的预过滤 df 和过滤后的 df。但是,这不能用上面的代码来完成。我将类更改如下,以便可以随时访问原始 df:

class File(object):

    def __init__(self, f):
        self.f = f
        self.filtered = None

    def view_ref(self):
        return self.f['REF']

    def filter_ref(self, val):
        ''' Filter REF column for the given val
        '''
        filtered = self.f[self.f['REF'] == val]
        self.filtered = filtered
        return self.filtered

上述方法的问题是我最终会有各种过滤和选择数据的方法,我希望将它们分开。所以我尝试为每个目的创建两个不同的类:

class File(object):

    def __init__(self, f):
        self.f = f
        self.filter = FilterFile(f)

    def view_ref(self):
        return self.f['REF']

class FilterFile(object):

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

    def filtered_ref(self, val):
        f = self.f[self.f['REF'] == val]
        self.f = f
        return self.f

在上面的示例中,我可以在 File 类中访问过滤后的 df 和原始 df,并且我将过滤和选择数据的方法分开。现在的问题是我不能将 File 方法 view_ref() 与 self.filter 实例一起使用。

我很难确定如何最好地组织这段代码。有人可以帮我指出最pythonic的方向来组织这个吗?

【问题讨论】:

    标签: python python-3.x class oop organization


    【解决方案1】:

    对于您可能遇到的所有情况,没有单一的解决方案。

    您可以使用不可变的File 对象来访问您的数据,并且任何修改您的数据的函数都会生成带有新数据的新对象。当过滤后的原始数据具有相同的属性或至少我们知道过滤后应该生成哪个类时,这很有用。这种策略的好例子是数字(intfloatDecimal)和类似字符串的对象(strbytes)。

    您可以在下面看到此解决方案的示例类。我在这里使用filter_function 作为参数来提供更多的运行时灵活性:

    class File:
       def __init__(self, df, filter_function=None):
           self.df = df
           self.filter_function = filter_function
    
       def view_field(self, field):
           return self.df[field]
    
       def filter(self, *args, filter_function=None):
           """ Returns filtered data in new File object. """
    
           if not self.filter_function:
                return self
           filtered = self.filter_function(self.df, *args)  # filter our data
           return File(filtered, filter_function)
    

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2020-01-11
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多