質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2134閲覧

pythonにおけるmoduleとclassの命名の考え方について

tyubo

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/12/30 01:37

実現したいこと

pythonでmodule単位でコードを分けようとした時、自分の中でわかりやすい名前をつけようとすると、module名とclass名が被ってしまいます。

こういう時、どのように考えれば分かりやすい(あるいはセオリー通りな)のか考え方を知りたいです。

前提

情報系の学生で、フレームワークなどを使うというよりは自分で1からコードを書くことが多いです。
また周囲にpythonについてよく知っている人もおらず、自分でググっては改善するを繰り返しています。

具体的な事例

例えば、簡易的なインベーダーゲームのようなものを作ったとします。(フィールドには自機、敵機、弾のみ)

その時、自分は「盤面のオブジェクトの位置情報を管理するmodule」と「自機module」「敵機module」「弾module」に分けてコーディングしたくなります。

この時、敵機を"enemy.py"に"class Enemy"と命名してしまいます。

すると、番面のmoduleで敵機を使いたい時に、"E = enemy.Enemy()"のように呼び出すことになるのですが、本当にこのやり方、あるいは命名方法で正解なのか自信が持てていません。

「enemy.Enemy()」とenemyという単語を繰り返すのも不自然な感じがしますし、classと関数だと関数名を動詞的に命名すると「Enemy.fire_bullet()」のような形で読みやすくなるなど聞いたことがあるのですが、moduleとclassではそのような約束事があるのか気になります。

割とニッチな悩みなのか検索してもいいアイディアが出てこず、ぜひ本職の方で色々知見をお持ちの方にアドバイス頂きたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/12/30 02:34

> 情報系の学生で、フレームワークなどを使うというよりは自分で1からコードを書くことが多いです。 > また周囲にpythonについてよく知っている人もおらず、自分でググっては改善するを繰り返しています。 他の学生は他言語を使用しているということでしょうか?
guest

回答3

0

余談だけ。

自分でググっては改善するを繰り返しています。

GitHubで「language:python」を条件にリポジトリを探すと、死ぬほど 大量にモジュールの実例が見つかります。こういったものを見てまわって、みんなが実際にどうやっているか観察してみたらいいのではないでしょうか (PyPIなどでもモジュールを取得できますが、中身を見るのに一手間必要なのでGitHubで探す方法をご紹介しました)。

実際、Pythonで「モジュール」と呼ばれるものは、一定のまとまりのあるプログラム部品を配布するための単位でしかないです。名前をクラスと対応づけなければならないという決まりはないですし、逆にクラスと名前がかぶっても構わないです (そして、クラスが一つだけのモジュールを作ったら同じ名前になるほうが自然かと思います)。

「enemy.Enemy()」とenemyという単語を繰り返すのも不自然な感じがしますし、

こういうモジュールもよくあると思います。この場合、コード中での繰り返しをなくすにはfrom enemy import Enemyとか書けばいいですが、結局繰り返してますね。

投稿2023/12/31 05:45

ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyubo

2024/01/08 04:14

ご回答ありがとうございます。またご返信が遅くなってしまい大変申し訳ありませんでした。 githubのリンクの共有ありがとうございます。検索エンジンで模範コードを探すのも限界を感じていたので、大変ありがたいです。今後も研鑽を積んでいきたいと思います。 モジュール名とクラス名は、わかりやすさ重視でつけて行こうと思います!
guest

0

まず、この件についてはコーディングについての具体的な質問ではないので、Q&Aではなく意見交換にしたほうがよかったと思います。

別観点からすると、1ファイル(モジュール)1クラスという構成だとすると、同名になるのは必然だと思います。pythonでは1つのファイルに複数のクラスを定義できますから、かならずしもそうならないのも必然です。
別の回答にあるdjangoのrequestsの例であれば、そのファイルの中には複数の種類のリクエストに対応するクラスが定義されているのでしょう。 この場合は、ファイル名とクラス名は別になり、リクエストの複数形であることを示すsが末尾についています。

投稿2023/12/30 08:01

TakaiY

総合スコア14315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyubo

2024/01/08 04:11

ご回答ありがとうございます。またご返信が遅くなってしまい大変申し訳ありませんでした。 Q&Aのセグメントでなかった件につき、ご指摘ありがとうございます。自分の知識が足りず失礼いたしました。今後気をつけたいと思います。 また、1モジュール=1classの場合なら必然ということで、自分の感覚がずれてなかったことが確認でき大変助かりました。ありがとうございました。
guest

0

ベストアンサー

わかりやすければ、同名でも同名でなくても、どちらでもいいのではないのでしょうか。

決まりごと(ファクト)

pyhton の規約である PEP 8の、モジュール名クラス名に関する記述には、下記のことしか書かれておらず、両者が同名でよいかどうかについての記述はありません

  • 「モジュール名は短く、すべて小文字にする。可読性を考慮して、アンダースコアを使ってもよい」(註:この記述から、モジュール名にはスネークケースを使った方が良いと、一般的に解釈されているようです)。

  • 「クラス名は、通常、CapWords規約(註:先頭を大文字にするということ)を使用する」

 

「enemy.Enemy()」とenemyという単語を繰り返すのも不自然な感じがします

個人的には特に不自然には感じません。
モジュール名は全部小文字、クラス名は大文字で始まっているので、一方がモジュール、他方がクラスであることは、すぐわかります。

(組込のdatetime モジュールのように、モジュール名とクラス名がどちらも小文字だと混乱しやすいですが)

どうしても不自然に感じていやなら、すべてのモジュールに「クラス名_module」とかつけるのも方法ではあります。
例)enemy_module.py, gameboard_module.py

これは自由です。ただ、個人的にいえば私は簡潔さの観点から、このような命名の仕方はほとんどしません。


具体的な例からの考察

ここで、例として、python のフルスタック web アプリケーションフレームワークである django のソースコードを見てみましょう。

すると、モジュール名とクラス名は同名のこともありますし、異なる名前のこともあることがわかります。

同名の例:
https://github.com/django/django/blob/main/django/http/multipartparser.py

→ multipartparser.py に MultiPartParser クラスを定義している。

異なる名前の例:
https://github.com/django/django/blob/main/django/http/request.py
→request.py に HttpRequest クラスを定義している。

django のパッケージを俯瞰する限りでは、
モジュール名は短く簡潔にする一方で
クラス名はその役割を説明できるような、ある程度詳しい名前にする傾向にあるようです。

なぜこのようになるかというと、モジュールは、より詳細な役割を持ったオブジェクト群をまとめることが多いから、と推察されます。


その他

もしかすると、質問者さんがモジュールとクラスを同名にすべきかどうか悩む背景には、モジュールとクラスは1対1対応でないといけないのでは、という偏った前提があったりはしませんか?
しかし、モジュールとクラスは必ずしも1対1で対応している必要はありません。モジュール内には、互いに関係の深い複数のオブジェクトをまとめて配置することもあり得ます。(適切なモジュール分割は、きちんとやろうとすると難しい作業です)

投稿2023/12/30 02:49

編集2023/12/30 02:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyubo

2024/01/08 04:09

ご回答ありがとうございます。またご返信が遅くなってしまい大変申し訳ありませんでした。 具体的に例を共有いただき大変助かりました。Djangoの該当箇所のソースを読み、自分の中で少しイメージが腑に落ちた感覚があります。 今後はベースのルールをしっかり守り、それ以外はわかりやすさ重視でコーディングしていきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問