我在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.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.py
和list.py
中的代码不同,但其基类中的代码完全相同。当list.py
导入它的基类即ScrapyCommand
时,该类应该从我在OtherCommand
参数中动态指定的文件中导入它的基类,即name
。
我该怎么做?我无法找到一种更简单的方法,因为我有很多Commands
而且我只能减少重复代码的数量。感谢您阅读本文。
-
至于name
属性。我并不完全倾向于使用class属性。如果你可以建议一个更好的存储导入语句我会去,但我需要显然在某处导入。我应该把它放在哪里?感谢
答案 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)