首页 > 解决方案 > 继承方法的功能如何像没用过一样重用呢?

问题描述

运行“新对象。数据比较”功能后,我想用一个新列表进行过滤。并给 data_comparison 一个新列表 method.new_object.data 采用我最后过滤的列表的值。但是我怎样才能像以前没有使用过 data_comparison 一样重用它呢?非常非常非常感谢。

import pandas as pd
import os


csv_path = os.path.expanduser("~/Desktop/dataset/traffic-crashes-vehicles-1.csv")
data = pd.read_csv(csv_path)
class MainData:
    def __init__(self, filter_items=None):
        self.data = data
        self.filter_items = filter_items

    def column_filter(self):
        self.data = self.data[self.filter_items]
        return self.data

    def data_clean(self):
        self.data = self.data.dropna()
        return self.data

    def data_comparison(self,item_compare_lists):
        item_compare_list = item_compare_lists
   
        for i in item_compare_list:
            if i == 'less than and equal to':
                self.data = self.data[self.data[item_compare_list[i]['item']].le(item_compare_list[i]['value'])]
            elif i == 'less than and not equal to value':
                self.data = self.data[self.data[item_compare_list[i]['item']].lt(item_compare_list[i]['value'])]
            elif i == 'the greater and not equal':
                self.data = self.data[self.data[item_compare_list[i]['item']].gt(item_compare_list[i]['value'])]
            elif i == 'greater and equal':
                self.data = self.data[self.data[item_compare_list[i]['item']].ge(item_compare_list[i]['value'])]
            elif i == 'equal to':
                self.data = self.data[self.data[item_compare_list[i]['item']].eq(item_compare_list[i]['value'])]
            elif i == 'not equal':
                self.data = self.data[self.data[item_compare_list[i]['item']].ne(item_compare_list[i]['value'])]
            else:
                print('eşit değil')
        return self.data



new_object = MainData(filter_items=['MAKE', 'NUM_PASSENGERS', 'VEHICLE_YEAR'])



new_object.column_filter()

#new_object.column_filter() 输出

                          MAKE  NUM_PASSENGERS  VEHICLE_YEAR
6                CHEVROLET             NaN        2017.0
7                   NISSAN             NaN        2017.0
18                 HYUNDAI             1.0        2017.0
24                   DODGE             NaN        2017.0
47               CHEVROLET             NaN        2017.0    

#在过滤列中的日期数据之后。第一个过滤器

item_compare_list = {
    'less than and not equal to value': {'item': 'VEHICLE_YEAR', 'value': 2018},
    'the greater and not equal': {'item': 'VEHICLE_YEAR', 'value': 2016},
}


new_object.data_comparison(item_compare_lists=item_compare_list)
print(new_object.data)

#我有问题的部分。第二个过滤器列表

item_compare = {
    'less than and not equal to value': {'item': 'VEHICLE_YEAR', 'value': 2019},
    'the greater and not equal': {'item': 'VEHICLE_YEAR', 'value': 2017},
}


new_object.data_comparison(item_compare_lists=item_compare)

print(new_object.data)

我在第二个过滤器和输出后遇到的问题

Empty DataFrame
Columns: [MAKE, NUM_PASSENGERS, VEHICLE_YEAR]
Index: []

我知道问题的原因 在第一个 data_comparison 函数运行时更改了数据。当我想第二次使用它时,数据不是以原始形式而是以过滤后的形式返回到“data_comparison”。我想要的是,每次我再次使用 data_comparison 方法时,都会保留第一个数据,而不是 data_comparison 数据。

标签: pythonpython-3.xoop

解决方案


您的问题是基于这样一个事实,即该方法不是函数。(您可能想熟悉这个概念。)相反,它是不纯的,即它改变了对象的状态。

为了使其纯粹,不要让它对对象应用更改,而是让它简单地返回值。如何处理面向对象编程中的方法有不同的风格: 一些设计更喜欢对象是完全不可变的;其他设计允许对象的突变。但总的来说,一种方法中操作对象返回值都是一个坏主意。

因此,在data_comparison方法中,您可以在方法的开头编写:

data = self.data

然后在该方法中替换self.databy的所有以下用法data。这将保持self.data不变,因此不会改变对象的状态。(请记住,每个方法中的第一个参数self, 是指对象。因此更改 的属性data就是self更改对象。)

您的代码中还有其他缺陷,但由于这不是代码审查,我将限制自己回答您的具体问题。


推荐阅读