类 MRJob Python TypeError: super(type, obj): obj 必须是 type 的实例或子类型

问题描述 投票:0回答:1

问题

在 Python 3.x 中运行 MRJob 类自定义代码。 MRJob 类已定义。 Jyputer Notebook 中的单元测试在单元测试中运行良好。将 Jyputer Notebook 保存到 Python .py 文件中,以便在控制台上运行以进行最终单元测试。

寻求有关configure_args对象上super的类型错误的帮助,以及我做错了什么,没有让实例对象成为JoinJob()对象的正确实例或子类型。

运行类实例的主流程

在 JoinJoin() 类上发出一个新的对象实例:

    instance = JoinJob()
    instance.testJob()

班级 class JoinJob() 定义了一个函数,configure_args,这是类方法定义。

    def configure_args(self)

类型错误第 122 行区域

此类 MapReduceJoinJob 是 MRJob 的子类,并在 /// 第 122 行 /// 处引发类型错误。可以看出,configure_args() 的函数定义已正确设置为在主类 JoinJob 及其定义的 configure_args() 上发出 super 来覆盖它。但是,在此示例中没有自定义自定义覆盖代码。

class MapReduceJoinJob(MRJob):
    OUTPUT_PROTOCOL = RawValueProtocol
    /// line 122 ///
    def configure_args(self):
        super(JoinJob, self).configure_args()

在主Python例程中,通过创建MapReduceJoinJob()的新实例来调用驱动程序类MapReduceJoinJob(),然后处理和调用

if __name__ == "__main__":
    driver_reduce_join()
    instance = MapReduceJoinJob() #// This is the area of Type Error

错误

TypeError: super(type, obj): obj must be an instance or subtype of type
line 122, in configure_args
    super(JoinJob, self).configure_args()
TypeError: super(type, obj): obj must be an instance or subtype of type

MRJob类定义

# MRJob MapReduce using MRJob (MRUnit in Python)
# MRJob / MRUnit Test unit class

class JoinJob():
///line 122///
    def configure_args(self):

        JoinJob.configure_args()

    def showResults(self, df_h_data, df_v_data, combine_row):

        print('MRJob Test Case : Columns from Dataset Homocides Non-Fatal')
        print('\n')
        df_h_data['HOMICIDE'].iloc[:9]
        print(df_h_data)

        print('MRJob Test Case : Columns from Dataset Victim Demographics')
        print('\n')
        df_v_data['HOMICIDE'].iloc[:8]

        print('MRJob Test Case : Combined Map Reduced Dataset Homocides Non-Fatal & Victim Demographics')
        print('\n')
        combine_row

        print(combine_row)


    # test classs function
    def testJob(self):

        h_data, v_data = MapReduceJoin()
        combined_row = CombineDatasets(h_data, v_data)
        df_combine_row = pd.DataFrame(combined_row)
        by='BATTERY'
        combine_row = SortVictimData(df_combine_row, sort_order=False, column=by)
        df_h_data = pd.DataFrame(h_data)
        df_v_data = pd.DataFrame(v_data)

        self.showResults(df_h_data, df_v_data, combine_row)


#%%
# MRJob MapReduce using MRJob (MRUnit in Python)

# Test: test differnt row filter, test sort

class MapReduceJoinJob(MRJob):
    OUTPUT_PROTOCOL = RawValueProtocol

    def configure_args(self):
        super(JoinJob, self).configure_args()

    instance = JoinJob()
    instance.testJob()


python class instance mrjob
1个回答
0
投票

将军

Python 中的

super(type, obj)

 函数用于调用子类的父类(超类)的方法。当您想要访问和调用父类中已在子类中覆盖或扩展的方法时,通常使用它。 super()
 函数有助于确保调用超类中的适当方法。

这里是如何理解

super(type, obj)


type:这是您要开始搜索方法的类。通常是您当前所在的子类(子类)。

obj:这是当前对象的实例。它是您要从中调用超类方法的子类的实例。


现状

所以在解释完之后,让我们看看现状:

TypeError: super(type, obj): obj 必须是 的实例或子类型 类型

这是合乎逻辑的,因为 self 与

JoinJob

 没有任何关系(不继承自 JoinJob)。这是问你关于 
MRJob
 的实现的重点,只是为了看看 
MRJob
JoinJob
 类之间是否存在关系。


还有更多需要澄清的地方

这里定义的意义是什么,你正在创建一个循环依赖,这可能会在

RecursionError

中爆炸?

class JoinJob(): def configure_args(self): JoinJob.configure_args() # very dangerous - circular ependency
您的 

MapReduceJoinJob

 中这个调用 
super(JoinJob, self).configure_args() 的要点是什么?如果你想调用 MRJob 的实现,你只需要super().configure_args()
,假设父类也有它。

我希望能有所帮助,祝你好运:)

© www.soinside.com 2019 - 2024. All rights reserved.