我在Ubuntu 13.04上使用Python 2.7。我正在构建一系列计划任务,将一些数据上传到第三方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()
我能够通过不再使用__init__()
方法进行初始化来解决问题。相反,我使用了一个基本的setup_info()
方法。我在基础中提出了一个NotImplementedError
,并在每个孩子中编写设置。没什么大不了的,但没那么优雅
我仍然想知道这个问题的根本原因是什么。我继承了芹菜PeriodicTask
。没什么新奇的。