2012-10-24 64 views
0

我有一個類中crawl.py這是這樣的:動態導入一個基類在Python

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。由crawl.py繼承的ScrapyCommand看起來是這樣的:

from someotherapp.crawl import OtherCommand 

class ScrapyCommand(OtherCommand):  

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

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

list.py繼承的ScrapyCommand看起來是這樣的:

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時,該類應該從我在name參數中動態指定的文件導入它的基類,即OtherCommand

我該怎麼做?我一直無法找到一個更簡單的方法來做到這一點,我只是走下這個兔子洞,因爲我有很多Commands,我可以大大減少重複代碼的數量。感謝您閱讀本文。

-

至於thew name屬性。我並不完全傾向於使用類屬性。如果你可以建議更好的商店進口聲明我會去,但我需要顯然有進口的地方。我應該把它放在哪裏?謝謝

回答

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) 
2

如果你絕對必須使用類屬性來做到這一點,你可以使用元類。但是,我沒有看到一個理由,至少從你所描述的理由來看,你不能只根據需要靜態地導入一個或兩個基類。你也可以通過使用多重繼承來更好地服務,而不是試圖將事情拖入單一的繼承層次。

+0

我並不完全傾向於使用類屬性。如果你能提出一個更好的方法,我會去那,但我需要顯然有進口的地方。我應該把它放在哪裏?謝謝。 –