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、2 つの別個のファイルから呼び出されます -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は単純で、インポート ステートメントを除いて、これら 2 つのファイルにはまったく同じコードが含まれています。インポートを見てください。

コードの重複の量を減らしたいと考えています。方法はありますか、基本クラスにそれ自身の基本クラスを動的にインポートさせることができます。crawl.pyとのコードlist.pyは異なりますが、基本クラスのコードはまったく同じです。インポートするとき、list.pyそれは基本クラス、つまりScrapyCommand、そのクラスはOtherCommand、パラメーターで動的に指定したファイルから基本クラス、つまりインポートする必要がありnameます。

これどうやってするの?これを行う簡単な方法を見つけることができませんでした。かなりの数Commandsのコードがあり、重複するコードの量を大幅に減らすことができたので、このうさぎの穴を下っているだけです。これを読んでくれてありがとう。

--

wname属性は。クラス属性の使用に完全に傾倒しているわけではありません。インポートステートメントをより適切に保存することを提案できる場合は、それを使用しますが、明らかにそのインポートをどこかに置く必要があります。どこに置けばいいですか?ありがとう

4

2 に答える 2

2

クラス属性を使用してこれを行う必要がある場合は、メタクラスを使用できます。ただし、少なくともあなたが説明したことから、必要に応じて1つまたは両方の基本クラスを静的にインポートできないという理由はわかりません。また、物事を単一の継承階層に押し込もうとするよりも、多重継承を使用したほうがよい場合もあります。

于 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 に答える