0

クラスを初期化するためのベスト プラクティスについて質問があります。複雑で多くのメンバーを持つクラスを考えてみましょう。の外でそれらを初期化するのは悪い習慣ですが、膨大な方法__init__()を使わずに問題を処理するにはどうすればよいですか。__init__()

例:

class A:
   def __init__(self):
       self.member0 = "a"

       # to prevent that the init method gets too big
       # put some initialisation outside
       init_other_stuff()

   def init_other_stuff(self):
       self.member1 = "b"
       self.member2 = "c"
       ...

前もって感謝します。

[更新]明確にする。もちろん、目標は別の長いメソッドに入れることではありません。代わりに、初期化を次のようなさまざまな部分に分割できます。

def init_network_stuff(self):
    """ init network setup """
    self.my_new_socket = socket.socket(..)


def init_local_stuff(self):
    """ init local setup """
    self.my_new_logpath = "/foo/bar/log"

...
4

1 に答える 1

0

また、属性が多すぎるのは、おそらく抽象化が不十分であることの兆候であり、通常は開発とデバッグが困難であることにも同意します。そのため、設計を変更することはおそらく良い考えです。

しかし、あなたは金のバッジを持っているので、あなたは明らかに周りにいて、(おそらく)自分が何をしているかを知っており、これを行う理由があるかもしれません. その場合、あなたが提案したように、初期化をカテゴリごとに分割することをお勧めします。私が持っている唯一の提案は、サブ初期化関数で _ を使用して、通常の使用を意図していないことをユーザーに知らせることです。

class A:
def __init__(self):
    self.member0 = "a"

    self.__init_other_stuff()

def __init_other_stuff(self):
   self.member1 = "b"
   self.member2 = "c"

など。これにより、ほとんどのコンソールとエディターでタブ補完からも隠されます。

もう 1 つの選択肢は、インターフェイスの一部を実装する複数のクラスのサブクラスとして、このクラスを作成することです。これらの項目を A に直接含める必要がある場合、つまり次のようにします。

class Logger(object):
    def __init__(self):
        self.logparam = 1

class NetworkSource(object):
    def __init__(self):
        self.netparam = 2

class A(Logger, NetworkSource):
    def __init__(self):
        Logger.__init__(self)
        NetworkSource.__init__(self)

In [2]: a = A()

In [3]: a.<tab>
a.logparam a.netparam

次に、比較的短い init を使用しながら、両方のクラスの機能を取得します。私見ですが、多重継承は概念的にもう少し複雑です。

于 2013-10-02T13:30:10.447 に答える