晴耕雨読

work in the field in fine weather and stay at home reading when it is wet

構造体を継承してコンストラクタをなくす(Python)

構造体を継承してコンストラクタをなくす(Ruby) の続き.

python3 には collections.namedtuple という構造体のような振る舞いをするクラスがある.

下の例では,「name」と「age」というフィールドを持つ構造体 Person を定義して, それを Person クラスが継承している.

from collections import namedtuple

class Person(namedtuple('Person', 'name age')):
    def hello(self):
        return ("Hello! My name is {} and I'm {} years old." \
                .format(self.name, self.age))

person = Person("Alice", 6)
print(person)         # => Person(name='Alice', age=6)
print(person.age)     # => 6
print(person.hello()) # => Hello! My name is Alice and I'm 6 years old.

namedtuple クラスのインスタンスもまたクラスなので,上のように継承することができる. python で単純に制約のないフィールドを定義したいならば,namedtuple を使うのをおすすめする.