Categories: Python

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

この記事では、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で構造体を使用するメリット

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

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

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

型を判別できる

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

Pythonでの代用方法

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モジュールもあります。

【Python】structモジュールの使い方この記事では、Pythonのstructモジュールの使い方について解説します。 structといえば構造体を思い浮かべるかもしれま...

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

  • 9.7. 残りのはしばし - クラス — Python ドキュメント
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Unity】アセットストアにあるアセットを追加・使用する方法

この記事では、Unityのアセットストア…

1日 ago

【Unity】値が変更された際に処理を実行したい

この記事では、値が変更された際に何かしら…

3日 ago

【Unity】クラスのパラメータをインスペクターから調整したい

この記事では、定義したクラスをインスペク…

4日 ago

【Unity】スプライト(画像)を差し替える方法

この記事では、Unityでスプライト(画…

5日 ago

【Pyhton】スタックやキューのように扱えるdeque(デック)の使い方

この記事では、スタックやキューのように扱…

3か月 ago

【Python】Queue(キュー)の種類と使い方

この記事では、PythonのQueue(…

3か月 ago