この記事では、Pythonで構造体を代用する方法を解説します。
Pythonには、構造体が用意されていません。しかし、ちょっと工夫することで構造体っぽいものを使うことが出来ます。
Python 3.7からデータクラスを簡単に定義できるdataclasses
モジュールが追加されました。気になる方は以下の記事を参照してください。
それでは、構造体の代用方法を見ていきましょう!
構造体とは、複数のデータ型をまとめて取り扱うための機能です。
以下のコードは、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で構造体を使うメリットには、以下のようなものがあります。
名前で要素にアクセスできる
データに要素名でアクセスすることによって、どのようなデータを呼び出しているかわかりやすくなります。
型を判別できる
isinstance
関数でインスタンスの型を判別することができます。それにより、型によって処理を分岐させることができます。
Python で構造体を代用するには、以下のようにclass(クラス)
を用います。
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
C言語と同様に大きなデータをコピーするにはそれなりのコストがかかるので注意しましょう!
この記事では、Pythonで構造体を代用する方法を解説しました。
Pythonで構造体を使うには、クラス
を使うことで代用することができました!
また、Pythonにはバイナリデータを扱うためのstruct
モジュールもあります。
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ