0

我有一堂课是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 >
        ...

他们都继承的这个类ScrapyCommand从两个单独的文件中调用 -myapp/crawl.pymyapp/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很简单,除了导入语句之外,这两个文件都包含完全相同的代码。看进口。

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

我怎样才能做到这一点?我还没有找到一种更简单的方法来做到这一点,我只是在这个兔子洞里走下去,因为我有很多Commands,我可以大大减少重复代码的数量。感谢您阅读本文。

--

至于 wname属性。我并不完全倾向于使用类属性。如果您可以建议更好地存储导入语句,我会使用它,但我显然需要在某个地方进行导入。我应该把它放在哪里?谢谢

4

2 回答 2

2

如果您绝对必须使用类属性来执行此操作,则可以使用元类。但是,至少从您所描述的情况来看,我看不出您不能根据需要静态导入一个或两个基类的原因。通过使用多重继承而不是试图将事物硬塞到单个继承层次结构中,您也可能会得到更好的服务。

于 2012-10-24T17:39:52.993 回答
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)
于 2012-10-24T17:43:03.727 回答