2016-04-18 3 views
1

私は、「ダウンロード」、「解析」、「更新」などの機能のリストを実装する約20の異なるクラスを使用する必要があるPythonプロジェクトに取り組んでいます。mixinsは親属性を使うべきですか?

いくつかの機能は簡単にスーパークラスを使用することによって分解されます。なぜなら、必要なコードがすべて同じであるからです。

しかし、「解析」メソッドの場合、同じアルゴリズムを実装する必要のある10個のクラスと、特定のアルゴリズムを必要とする10個のクラスがあります。

私がPythonについて知っていることに基づいて、この振る舞いはmixinを使うことで簡単に因数分解できます。

"解析"アルゴリズムが同じでも、解析されたエントリにタグを適用する必要がありますが、このタグは各クラスに固有のものです。この目標を達成するためにmixinによってのみ使用されるクラス属性を使用する適切な方法であるかどうかは疑問です。

このコードのチャンクは属性が使用されている方法の例を与える:

class MyMixin(): 
    def parse(self): 
     print(self.tag) 
     ... 

class MyClass(MyMixin): 
    tag = 'mytag' 

私はすでにいくつかのフレームワーク(http://www.django-rest-framework.org/api-guide/generic-views/)でそれを見たが、私は、コミュニティの意見何を知って興味があります。具体的な例を要約すると

==========================

EDIT

、私がすべき

class MyMixin(): 
    def do_something(self): 
     print(self.tag) 

class MyClass(MyMixin): 
    tag = 'mytag' 

if __name__ == '__main__': 
    c = MyClass() 
    c.do_something() 

またはその:この書き込み

class MyMixin(): 
    def do_something(self, tag): 
     print(tag) 

class MyClass(MyMixin): 
    tag = 'mytag' 

if __name__ == '__main__': 
    c = MyClass() 
    c.do_something(c.tag) 

答えて

0

をあなたは彼にいくつかの余分な安全性を得ることができますabcモジュールのLP:属性にアクセスしたときにエラーが素敵なキャッチされ、早期の代わりにされ

from abc import abstractproperty, ABCMeta 

class Parser(object): 
    __metaclass__ = ABCMeta 

    @abstractproperty 
    def tag(self): 
     pass 

class Concrete(Parser): 

    @property 
    def tag(self): 
     return 'concrete' 

print Concrete().tag # => prints 'concrete' 

class Incomplete(Parser): 
    pass 

# Raises error: 
# TypeError: Can't instantiate abstract class Incomplete with abstract methods tag 
Incomplete() 

(Pythonの3のコードは多少異なる場合があります)

この方法です。

さらに、PyCharmはクラスが定義で不完全であることを警告します。おそらく他の静的解析ツールもこれを選ぶことができます。

enter image description here

関連する問題