在Python中动态导入基类

时间:2012-10-24 17:36:00

标签: python inheritance

我在crawl.py中有一个类,就像这样:

from myapp.crawl import ScrapyCommand

class Command(ScrapyCommand):

    name = 'someotherapp.crawl' #this should be the dynamic import

    def handle(self, *args, **options):
        super(Command, self).handle(self, *args, **options)
        ...
        ...< custom code >
        ...

,名为list.py的文件包含:

from myapp.list import ScrapyCommand

class Command(ScrapyCommand):

    name = 'someotherapp.list' #this should be the dynamic import

    def handle(self, *args, **options):
        super(Command, self).handle(self, *args, **options)
        ...
        ...< some other custom code >
        ...

他们都从两个单独的文件ScrapyCommandmyapp/crawl.py继承了这个名为myapp/list.py的类。 ScrapyCommand继承的crawl.py如下所示:

from someotherapp.crawl import OtherCommand

class ScrapyCommand(OtherCommand):     

    def __init__(self, *args, **kwargs):
        ...
        ...

    def handle(self, *args, **options):
        return

ScrapyCommand继承的list.py如下所示:

from someotherapp.list import OtherCommand

class ScrapyCommand(OtherCommand):

    def __init__(self, *args, **kwargs):
        ...
        ...

    def handle(self, *args, **options):
        return

为简洁起见,我编辑了这段代码。 ScrapyCommand中的逻辑很简单,除了import语句之外,这两个文件都包含完全相同的代码。看看进口。

我希望减少重复代码的数量。有没有办法,我可以让基类动态导入它自己的基类。 crawl.pylist.py中的代码不同,但其基类中的代码完全相同。当list.py导入它的基类即ScrapyCommand时,该类应该从我在OtherCommand参数中动态指定的文件中导入它的基类,即name

我该怎么做?我无法找到一种更简单的方法,因为我有很多Commands而且我只能减少重复代码的数量。感谢您阅读本文。

-

至于name属性。我并不完全倾向于使用class属性。如果你可以建议一个更好的存储导入语句我会去,但我需要显然在某处导入。我应该把它放在哪里?感谢

2 个答案:

答案 0 :(得分:2)

如果绝对必须使用类属性,则可以使用元类。但是,我没有看到一个原因,至少从你所描述的,你不能只是根据需要静态导入一个或两个基类。通过使用多重继承而不是试图将内容转换为单个继承层次结构,您也可以得到更好的服务。

答案 1 :(得分:1)

您可以从函数构造一个类。这会解决您的问题吗?

def make_scrapy_command_class(base_class):
    class ScrapyCommand(base_class):
        # your methods here
        pass

    return ScrapyCommand

ScrapyCommand = make_command_class(someotherapp.crawl.OtherCommand)