1

私はこのように複合パターンを実装しています:

1)「抽象」コンポーネントは次のとおりです。

class Component(object):
    """Basic Component Abstraction"""
    def __init__(self, *args, **kw):
        raise NotImplementedError("must be subclassed")

    def status(self):
        """Base Abstract method"""
        raise NotImplementedError("must be implemented")

2)葉:

class Leaf(Component):
    """Basic atomic component
    """
    def __init__(self, *args, **kw):
        self.dict = {}

    def status(self):
        """Retrieves properties
        """
        return self.dict

問題は、もちろん、pylintが次の警告を生成することです。

Leaf.__init__: __init__ method from base class 'Component' is not called

しかし、私の葉に私は呼び出すことができません:

def __init__(self, *args, **kw):
    Component.__init__(self, *args, **kw)
    self.dict = {}

例外を発生させることなく。

pylintの警告を無視する必要がありますか、それともコーディングに問題がありますか?

4

5 に答える 5

4

抽象初期化子は悪い考えです。ルートコンポーネントで初期化を実行するようにコードが進化する可能性があります。また、イニシャライザの実装が必要な理由がない場合でも。一部のサブクラスでは、空の初期化子を選択できます。

Componentクラスのインスタンスが必要ない場合は、イニシャライザで確認してください。

class Component(object):
    def __init__(self, **kwargs):
        assert type(self) != Component, "Component must not be instantiated directly"

class Leaf(Component):
    def __init__(self, some, args, **kwargs):
        # regular initialization
        Component.__init__(self, **kwargs)
于 2009-07-07T09:52:05.310 に答える
2

Markusのアイデアを補完する別の提案:

本当に必要な場合は、__ new __を使用して、指定されたオブジェクトタイプを確認することをお勧めします。「コンポーネント」の場合、例外を発生させることができます。

class Component(object):
"""Basic Component Abstraction"""

def __new__(objType, *args, **kwargs):
    if objType == Component:
       raise NotImplementedError("must be subclassed")
    return object.__new__(type, *args, **kwargs)

サブクラスが作成されると、objTypeは!= Componentになり、すべてが正常になります!

于 2009-07-07T10:22:43.533 に答える
2

クラスComponentの名前をAbstractComponentに変更すると役立つはずです。また__init__ 、サブクラスによって呼び出されることが想定されていない場合は、基本クラスにメソッドを指定しないでください。

于 2010-02-26T13:21:51.433 に答える
1

基本クラスのコンポーネントがインスタンス化されていないことを保証する必要があります。これは、C ++などの他のプログラミング言語で一般的な高貴なゲストです(コンストラクターをプライベートにするなどして、直接使用できないようにすることができます)。

ただし、Pythonではサポートされていません。Pythonはすべてのプログラミング概念をサポートしているわけではなく、より「動的」です。したがって、初期化は「Pythonic」の方法で行われ、あなたの概念はこのようにサポートされていません。

Pythonは他の言語よりもはるかに信頼に基づいています。たとえば、静的変数はサポートされておらず、プライベート変数も限られた方法でしかサポートされていません。

何ができるか(モジュールのユーザーを信用しない場合)-「_Component」という名前を付けることで基本クラスを非表示にすることができます-これを内部シークレットにします。しかしもちろん、これは他の問題を引き起こす可能性があります。

于 2009-07-07T10:07:28.633 に答える
1

それ自体は悪いコーディングではありませんが__init__、コンポーネントのは単に必要ありません。必要に応じて、pylintを無視できますが、__init__コンポーネントからを削除することをお勧めします。

ダイナミズムを受け入れましょう!

于 2009-07-07T10:21:46.920 に答える