読者です 読者をやめる 読者になる 読者になる

Pythonでインスタンス変数を初期化するだけの`__init__`を省略する

こんなクラスを作るとします。インスタンス変数を初期化するだけの退屈なコードです。

class Foo:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

foo = Foo(1, 2, 3)

だるいですね。

namedtupleを使うと__init__を捨てて楽に初期化できます。

Foo = namedtuple('Foo', 'a', 'b', 'c')
foo = Foo(1, 2, 3)

ただnamedtupleは不変データ構造なのでattributeに再代入不可なんですが。

foo.a = 1
# => AttributeError: can't set attribute

namedtupleを継承することによりクラスにメソッドを追加できます。

class Foo(namedtuple('Dummy', ['a', 'b', 'c'])):
    def __init__(self, a, b, c):
        pass

    def accum(self):
        return self.a + self.b + self.c

たぶん日本語でももっとちゃんとした説明した記事があると思います。以下のダベりに触発された記事でした。

What are the most repetitive pieces of code that you keep having to write? : Python