Python

【Python】構造体をなにかで代用する方法

この記事では、Pythonで構造体を代用する方法を解説します。Pythonには、構造体が用意されていません。しかし、ちょっと工夫することで構造体っぽいものを使うことが出来ます。それでは、構造体の代用方法を見ていきましょう!

構造体とは?

構造体とは、複数のデータ型をまとめて取り扱うための機能です。以下のコードは、C言語でpersonという名前の構造体を定義しています。

typedef struct
{
    char name[256];  // 名前
    int age;         // 年齢
}person;

この構造体を使うには、以下のようにします。

int main()
{
    // person構造体の宣言
    person mike;
    // 名前の初期化
    strcpy(mike.name, "Mike");
    // 年齢の初期化
    mike.age = 21;
    // 出力
    printf("name: %s, age: %d", mike.name, mike.age);
}

実行結果

name: Mike, age: 21

このように、構造体を定義することで異なった型の要素をひとまとめに扱えます。しかし、Pythonではリストやタプルで異なった型をまとめて扱うことができます。それでは、Pythonで構造体を扱うとどのようなメリットがあるのでしょう?

Pythonで構造体を使用するメリット

Pythonで構造体を使うメリットには以下のようなものがあります。

名前で要素にアクセスできる

データに要素名でアクセスすることによって、どのようなデータを呼び出しているかわかりやすくなります。

型を判別できる

isinstance関数でインスタンスの型を判別することができます。それにより、型によって処理を分岐させることができます。

Pythonでの代用方法

Pythonで構造体を代用するには、以下のようにクラスを用います。

class person:
    pass

mike = person()
mike.name = 'Mike'
mike.age = 21

print(f'name: {mike.name}, age: {mike.age}')

実行結果

name: Mike, age: 21

コンストラクタを定義することで、初期化が楽にできます。

class person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

mike = person('Mike', 21)

print(f'name: {mike.name}, age: {mike.age}')

実行結果

name: Mike, age: 21

また、特定のデータ型を要求する関数などに、必要なメソッドを定義したクラスを渡すことができます。

構造体は値渡し…

C言語の構造体は値渡しですが、Pythonは参照渡しです。なので、Pythonでは以下のように関数内で値を書き換えられます。

def func(person):
    person.name = 'John'

# 値が書き換わってしまう
func(mike)

print(mike.name)

実行結果

John

コピーを渡すことで、値が書き換えられてしまうのを防ぐことができます。

import copy

func(copy.deepcopy(mike))

print(mike.name)

実行結果

Mike

大きなデータをコピーするにはそれなりのコストがかかるので注意しましょう!

まとめ

この記事では、Pythonで構造体を代用する方法を解説しました。Pythonで構造体を使うにはクラスで代用することができました!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

【おすすめ】Python参考書