【问题标题】:Python MRO and Passing kwargs through super()Python MRO 和通过 super() 传递 kwargs
【发布时间】:2013-06-27 18:22:00
【问题描述】:

我在 Ubuntu 13.04 上使用 Python 2.7。我正在构建一系列计划任务以将一些数据上传到第 3 方 API。我正在尝试以通用方式构建任务,以便我们以后可以轻松添加更多任务。在这样做的过程中,我使用了一些无法按预期方式工作的继承技术。我认为 MRO 非常简单,但我一定是做错了什么,因为我在尝试初始化任务时收到了global name 'UpdateBase' is not defined。

下面是我使用的继承结构。

class UpdateBase(PeriodicTask):
    def __init__(self, table_type=None, update_type=constants.UPDATE_REALTIME,
                 cache_time=constants.CACHE_TIME_UPDATE):
        super(UpdateBase, self).__init__()
        self.table_type = table_type
        self.update_type = update_type
        self.cache_time = cache_time
        self.filename = '{}-{}.{}'.format(
            table_type, datetime.datetime.now(), self.update_type)
        self.old_files = '{}-*'.format(table_type)
        self.file_path = os.path.join(
            constants.UPDATE_FILE_PATH, self.filename)


class UpdateAffiliates(UpdateBase):
    def __init__(self, **kwargs):
        super(UpdateAffiliates, self).__init__(
            table_type=constants.AFFILIATES, **kwargs)


class OverlapAffiliates(UpdateAffiliates):
    def __init__(self, **kwargs):
        super(OverlapAffiliates, self).__init__(
            update_type=constants.UPDATE_OVERLAP,
            cache_time=constants.UPDATE_OVERLAP, **kwargs)

关于我为什么会收到此错误的任何建议?

编辑1:

似乎是其他原因导致了这个NameError。我已经建立了几个层次结构来测试这个 MRO。我已经测试了我能想到的所有方法,一切都很好。如果有人能想到我可以检查、更改或包含的任何内容以提供帮助,我将不胜感激。

测试代码示例:

#!/usr/bin/env python

CONST1 = 'const_1'
CONST2 = 'const_2'
CONST3 = 'const_3'


class Test1(object):
    internal_val = 'internal 1'

    def __init__(self, val1=None, val2=CONST2, val3=CONST3):
        print 'val1: {}\nval2: {}\nval3: {}\ninternal_val: {}'.format(
            val1, val2, val3, self.internal_val)


class Test2(Test1):
    def __init__(self, **kwargs):
        super(Test2, self).__init__(val1=CONST1, **kwargs)


class Test3(Test2):
    internal_val = 'internal 3'

    def __init__(self, **kwargs):
        super(Test3, self).__init__(
            val2='test3 val2', val3='test3 val3', **kwargs)


def main():
    test1 = Test1()
    test2 = Test2()
    test3 = Test3()

if __name__ == '__main__':
    main()

【问题讨论】:

  • 请发布 NameError 的堆栈跟踪。

标签: python multiple-inheritance method-resolution-order


【解决方案1】:

我能够通过在 __init__() 方法中进行初始化来解决我的问题。相反,我使用了基本的setup_info() 方法。我在基础上提出了一个NotImplementedError,然后在每个孩子中编写设置。没什么大不了的,但没有那么优雅。 :)

我仍然想知道这个问题的根本原因是什么。我继承了芹菜PeriodicTask。没什么特别的。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多