Contents
- Pythonのクラスが難しくてよくわかりません。 ・初心者には勉強する必要がありますか? ・どんな時に使い、何が便利にになるのでしょうか?
- AM+FFT を🔹 関数だけ版🔹 クラス版で比較してみる
- これはどうやって実行して結果を得るのですか? class Person: def __init__(self, name, age): self.name = name self.age = age ——– def greet(self): print(f”こんにちは、{self.name}です”)
- p1 = Person(“太郎”, 20) p1.greet() は別ファイルでも実行可能ですか?
- from person import Person personとPersonの違いは何ですか?
- Classが理解できない、難しい人のために
- ここで僕にはpythonの__init__とselfが分からない話をします
Pythonのクラスが難しくてよくわかりません。
・初心者には勉強する必要がありますか?
・どんな時に使い、何が便利にになるのでしょうか?
とても大事な質問です 👍
まず安心してください。
🔹 初心者の段階で「無理に」クラスを理解する必要はありません。
🔹 でも、いずれ必ず役に立つ場面が来ます。
順番に整理します。
① クラスって結局なに?
超シンプルに言うと:
「データ」と「その操作」をセットにする箱です。
🔧 関数だけで書くと…
name = "田村"
age = 40
def greet(name):
print(f"こんにちは、{name}です")
greet(name)
問題:
name と age がバラバラ
人が増えると管理が面倒
📦 クラスで書くと
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"こんにちは、{self.name}です")
使う:
p = Person("田村", 40)
p.greet()
👉 人の情報と操作がまとまる
② 初心者に必要か?
🔹 結論
今すぐ必須ではありません。
あなたが今やっている:
NumPy
matplotlib
FFT
Notebook実験
👉 これは 関数中心で十分
③ では、いつ使う?
クラスが必要になる場面:
✅ 1. 状態を持つもの
例:
AM信号(周波数・振幅を持つ)
GUIボタン
ゲームキャラクター
銀行口座
✅ 2. 同じ種類のものがたくさんある
例:
p1 = Person(“A”, 20)
p2 = Person(“B”, 30)
p3 = Person(“C”, 40)
同じ構造を量産できる。
✅ 3. 大きなプログラムを書くとき
ファイルが増える
機能が増える
状態管理が必要になる
④ 何が便利になるの?
🔹 ① まとめられる
バラバラな変数が整理される。
🔹 ② 読みやすくなる
signal.modulate()
signal.fft()
signal.plot()
→ 何をしているか明確。
🔹 ③ 再利用しやすい
別プロジェクトでもそのまま使える。
⑤ 逆に、クラスが不要なとき
単純な計算
小さなスクリプト
数学実験
データ解析Notebook
👉 無理に使う必要なし。
⑥ 今のあなたの位置
あなたは今:
実験
数値計算
可視化
の段階。
この段階では:
関数をしっかり理解することが最優先
クラスは「少し先の道具」です。
🎯 たとえ話
関数は「工具」
クラスは「工具箱」
工具だけでも作業できる。
でも工具箱があると整理できる。
🔥 私のおすすめ
今は:
✔ 関数を自在に書けるようになる
✔ ファイル分割を理解する
✔ import を使いこなす
ここまで行ったら
自然にクラスが必要になります。
🌱 まとめ
今すぐ必須ではない
状態を持つときに使う
量産するとき便利
大規模化すると必須
小さな実験なら不要
もしよければ:
あなたが作っている AM / FFT を
「関数版」と「クラス版」で比較してみますか?
それを見ると、一瞬で違いが分かりますよ 😄
AM+FFT を🔹 関数だけ版🔹 クラス版で比較してみる
🟢 ① 関数だけで書く場合
import numpy as np
import matplotlib.pyplot as plt
def am_signal(t, fc, fm, mu):
carrier = np.cos(2*np.pi*fc*t)
message = np.cos(2*np.pi*fm*t)
return (1 + mu*message) * carrier
def fft_signal(signal, fs):
S = np.fft.fft(signal)
freq = np.fft.fftfreq(len(S), 1/fs)
amp = np.abs(S) / len(S)
return freq, amp
# パラメータ
fc = 1_000_000
fm = 1_000
mu = 0.5
fs = 20_000_000
T = 2e-3
t = np.arange(0, T, 1/fs)
# 信号生成
s = am_signal(t, fc, fm, mu)
# FFT
freq, amp = fft_signal(s, fs)
plt.plot(freq[:5000], amp[:5000])
plt.show()
✅ 特徴
✔ シンプル
✔ 小規模なら十分
❌ パラメータ管理がバラバラ
❌ 信号を複数扱うと整理が大変
🔵 ② クラスで書く場合
import numpy as np
import matplotlib.pyplot as plt
class AMSignal:
def __init__(self, fc, fm, mu, fs, T):
self.fc = fc
self.fm = fm
self.mu = mu
self.fs = fs
self.T = T
self.t = np.arange(0, T, 1/fs)
self.signal = None
def generate(self):
carrier = np.cos(2*np.pi*self.fc*self.t)
message = np.cos(2*np.pi*self.fm*self.t)
self.signal = (1 + self.mu*message) * carrier
def fft(self):
S = np.fft.fft(self.signal)
freq = np.fft.fftfreq(len(S), 1/self.fs)
amp = np.abs(S) / len(S)
return freq, amp
def plot(self):
freq, amp = self.fft()
plt.plot(freq[:5000], amp[:5000])
plt.show()
使い方:
am = AMSignal(1_000_000, 1_000, 0.5, 20_000_000, 2e-3)
am.generate()
am.plot()
🎯 違いが分かりますか?
関数版
外にパラメータが散らばる
何を渡しているか追いにくい
クラス版
パラメータがまとまる
信号が「1つの物体」になる
メソッドで操作できる
🧠 重要な理解
クラスは「信号」という“モノ”を作るという考え方。
関数版は「処理をする」という考え方。
🔥 どちらが正解?
小規模 → 関数で十分
複数信号・拡張 → クラスが有利
例えば:
am1 = AMSignal(…)
am2 = AMSignal(…)
と簡単に増やせます。
🌱 今のあなたへのおすすめ
今は:
✔ 関数で十分
✔ クラスは「整理用ツール」と理解するだけでOK
無理に使う必要はありません。
次の理解段階
なぜ self が必要なのか?
クラスの中の変数はどこに保存されるのか?
dataclassとは?
どこまで深掘りしますか?
これはどうやって実行して結果を得るのですか?
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
——–
def greet(self):
print(f”こんにちは、{self.name}です”)
とても良い質問です 👍
今のコードは**「クラスを定義しただけ」**なので、まだ何も実行されていません。
🔎 今の状態
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f”こんにちは、{self.name}です”)
これは
✔ Person という「設計図」を作った
✖ まだ「人(オブジェクト)」は作っていない
だから何も表示されません。
✅ 実行して結果を出す方法
① クラスの下にこれを追加してください
p1 = Person(“太郎”, 20) # インスタンス(実体)を作る
p1.greet() # メソッドを実行する
🔵 完成形
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"こんにちは、{self.name}です")
p1 = Person("太郎", 20)
p1.greet()
▶ 実行結果
こんにちは、太郎です
🎯 何が起きているか
① p1 = Person(“太郎”, 20)
→ Person クラスから「太郎さん」という人を作った
そのとき
__init__ が自動で呼ばれる
self.name = "太郎"
self.age = 20
が保存される
② p1.greet()
→ greet メソッドを実行
→ self.name を使って表示
🧠 超シンプル理解
クラス = 設計図
インスタンス = 実際の物
メソッド = その物ができること
💡 さらに試してみる
p2 = Person("花子", 18)
p2.greet()
結果:
こんにちは、花子です
もしよければ次は
・selfって何?
・__init__ってなぜ必要?
・インスタンスって何?
を超わかりやすく解説しましょうか? 😊
p1 = Person(“太郎”, 20)
p1.greet()
は別ファイルでも実行可能ですか?
はい、可能です 👍
ただし「やり方」があります。
🎯 結論
✅ 別ファイルでも実行できる
👉 そのためには クラスを import する
📁 例:2つのファイルに分ける
① person.py(設計図ファイル)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"こんにちは、{self.name}です")
② main.py(実行ファイル)
from person import Person
p1 = Person("太郎", 20)
p1.greet()
▶ 実行方法
ターミナルで
python main.py
(▷RunでもOK)
🔎 何が起きているか
from person import Personは
👉 person.py から Person クラスを読み込むという意味です。
🚨 大事なポイント
✔ 2つのファイルは同じフォルダに置く
✔ ファイル名は person.py(拡張子 .py)
✔ person.py の中に余計な実行コードを書かない
💡 さらに一歩(よくある書き方)
person.py にテストコードを書く場合は:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"こんにちは、{self.name}です")
if __name__ == "__main__":
p = Person("テスト", 0)
p.greet()
こうすると:
person.py を直接実行したときだけ動く
import したときは動かない
という便利な仕組みになります。
🧠 なぜ別ファイルに分ける?
✔ プログラムが大きくなっても整理できる
✔ クラスを再利用できる
✔ 本格的な開発では必須
Takao Tamuraさんは Notebook と src フォルダを使っていましたよね。
その場合のベストなフォルダ構成も説明しましょうか? 😊
from person import Person
personとPersonの違いは何ですか?
とても良い質問です 👍
ここは初心者が一番混乱するところです。
✅ 結論
from person import Person
部分 意味
person ファイル名(モジュール名)
Person クラス名
🔹 person(小文字)
👉 ファイル名
person.pyというファイルのことです。
Pythonでは
「.pyファイル = モジュール」と呼びます。
🔹 Person(大文字)
👉 クラス名
person.py の中に書いてある
class Person:
このクラスの名前です。
🎯 つまりこういう意味
from person import Personは
👉 person.py の中にある Person クラスを使います
という意味です。
🧠 イメージ図
📁 フォルダ
├─ person.py ← 設計図ファイル
└─ main.py ← 実行ファイル
person.py の中:class Person:
main.py の中:from person import Person
🔎 なぜ小文字と大文字?
Pythonの慣習(ルール)で:
| 種類 | 書き方 |
|---|---|
| ファイル名 | 小文字 |
| クラス名 | 先頭大文字(PascalCase) |
| 変数名 | 小文字 |
💡 例えると
person = 本のタイトル
Person = 本の中の登場人物の設計図
🚨 もしこう書いたら?
from Person import person
❌ エラーになります。
Pythonは
✔ 大文字と小文字を区別する
✔ 正確に一致しないとダメ
🌱 まとめ
| 書き方 | 正体 |
|---|---|
| person | ファイル |
| Person | クラス |
| p1 = Person(…) | インスタンス |
理解がかなり進んでいますよ 😊
次は「モジュール」と「パッケージ」の違いも知りたくなりますが、いきますか?
Classが理解できない、難しい人のために
最終更新日 2022年07月15日
投稿日 2022年07月15日
この記事を書いた理由
私はエンジニアの学習を始め、一通り文法を勉強しましたが
Classの意味が本当にわからなかったです。
わからない原因をずーっと考えていましたが、自分なりの答えにやっと辿り着きました。
それは『Classの概念がなぜ必要かわからない』というところでした。
覚えておいた方が良い前提条件
Classの説明に関してはあらゆるところで見ると思います。
よく見るのが
Classとはモノの設計書です。
Classとは概念です。
Classはインスタンスを生成してから使います、、
例えば自動車の設計図を説明用によく見たりします。
こんなこと書かれてあーなるほどね。そう理解する人はごく少数だと思います
そこで、知っておくべきこととして大事なことですが
*アプリケーションは何百ものソースコードの集合体で出来ている
*簡単なアプリケーションでも約3万文字はくだらない、、、
無限にあるソースコードの中にvar name = ‘坂本’;と書くじさつ行為
そんな膨大なソースコードの中に
var name = ‘坂本’とかいたらどうなるでしょうか?
→nameという変数が以前に使われているのかどうかもわからない
→nameという変数が抽象的すぎてわからない
以前使ったかどうか、変数、関数が何を表しているかどうかわからない
ということになります。
そこで
『GIANTSの坂本』といえば、あー坂本勇人か!(野球ネタですみません)とわかるはずです。
*2022年現在、坂本勇人選手はGIANTSに二人いますw
ところが変数名を
var giantsKeyplayerName = ‘坂本’;
とかにすると、今度は
あれ?前回どんな変数名を付けたんだっけ、、?という現象になります
なので例えば
各チームの中に、キープレイヤーがいるとしたら
keyplayerというクラスの中に
*giants
*tigers
*swallows
*carp
*baystars
*dragons
というクラスを作っておくと
var giantsKeyplayerName = ‘坂本’;
みたいな野暮ったい変数を毎回使わず
keyplayer.giants = ‘坂本’;というスッキリした書き方にできる訳です
**細かい書き方はそのうち書き足します。
まとめ
まとめると、『ソースコードが多くなればなるほど、整理整頓をしないと、開発者がわからなくなるよ!
(ましてやチーム開発でこれをやられると嫌われますw)
ここに書いてあるのはあくまでClassのごく一部の事しか書いておりません。
なのでとっかかりだけ書きました。
*ちなみにベイスターズファンです。
ここで僕にはpythonの__init__とselfが分からない話をします
最終更新日 2018年05月03日
投稿日 2018年05月03日
初心者にとって、コーディングは知らないと訳の分からないことが多いです。
その代表格と言ってもいいのがpythonの__init__とselfだと思います。コーディングしてみるか〜と思っても、参考コードにこれらが入っているだけでギブorコピペ。
本記事はそのような状況に苦しんでいるそこのあなたではなくここの僕のための記事です。(ごめんなさい)
頼むから__init__( ):って何なのか教えてくれ
現時点で分からないもの:__init__, self
皆さんが載せているようなコードの多くには、コマンドラインに__init__という正体不明の関数が登場してきます。そこには非常に簡易的に__init__について説明されているのですが、僕にはなんのこっちゃ…ということが多いです。
コンストラクタとは、新たにオブジェクトが生成される際に呼び出されて内容の初期化などを行なうメソッドのことであり、メッソド名は__init__とする。
しかし上の文言をみる限り、どうやら__init__を理解するためにはコンストラクタ、オブジェクト、メソッドというものについて知っておかなければならなそうです。
現時点で分からないもの:__init__, self, コンストラクタ, オブジェクト, メソッド
クラス内の関数をメソッドと呼びます。
メソッドの宣言は、クラス外と同じようにdefを使用して宣言します。
クラス外で宣言した場合と異なる点は、第一引数にそのクラスのインスタンスを表すオブジェクトを受け取ります。
そのオブジェクト名は、慣習で「self」という名称になっています。
-Python クラスについて
なるほど!つまりそのクラスの中で定義した関数をそのクラス内で使いたいときはself.関数名として、それを引数の中にもいれなければいけないということか!
よし、メソッドとself.は解決。でもインスタンスってなんなんだろう…
現時点で分からないもの:__init__, コンストラクタ, オブジェクト, インスタンス
オブジェクトとインスタンスについては以下の記事に少し書いてありました。
→Python のオブジェクトって何?
ちなみにこのGirlFriendは”クラス”です。
qiita.rb
# インスタンスオブジェクト
>>> girl_friend = GirlFriend('サーバルちゃん')
>>>
先程の記事を僕なりに解釈した結果
インスタンス:girl_friend
オブジェクト:依然不明
インスタンスオブジェクト:GirlFriend(‘サーバルちゃん’)
ということが分かりました。ちなみに、インスタンス化とは『実体化』することのようで、インスタンスの作成は、「クラス名()」というようにして呼び出されるようです。記事内では、インスタンスオブジェクトを、「変数に代入できるもの」と定義していました。だいぶ広義。
たしかにこういうコマンドを絶対挟むもんなあと思いながら、クラスから関数を呼び出すことなく代入している?!となりました。
もしやこれに何か意味があるのでしょうか…
qiita.rb
class Member:
name = ""
def showMsg(self):
print("Hello," + self.name + ".How are you?")
taro = Member()
taro.name = "Taro"
taro.showMsg()
hanako = Member()
hanako.name = "Hanako"
hanako.showMsg()
このようにtaroやhanakoなどのインスタンスはクラスMemberを使って独立させることができるようです。これはたしかに便利です。
→初心者のためのPython入門
現時点で分からないもの:__init__, コンストラクタ, オブジェクト
先ほど依然として不明だったオブジェクトとは何なのかについてです。
-Pythonの基礎 オブジェクト(クラス)
オブジェクトとは?
変数や関数を、ひとまとまりにしたもの。
よく使う例えでは、車というオブジェクト
| 変数 | 関数 |
|---|---|
| タイヤ | タイヤの状態の取得やブレーキという操作 |
| ボディ | ドアが開いているかどうかのチェックや警告 |
| エンジン | エンジンの制御 |
| ハンドル | ハンドルの入力にあわせたタイヤの操作 |
つまりオブジェクトとは、『クラスや関数、そして変数によって構成されたものならなんでもオブジェクト』と言えると解釈しました。
現時点で分からないもの:__init__, コンストラクタ
コンストラクタとは、「__init__」という名前の部分です。
コンストラクタは、インスタンスを作成する際に重要な処理を含むものです。
どのように生成するか、どのようなデータを持たせるかなど、といった情報を定義するのに必要なメソッドになります。
-【Python入門】オブジェクト指向とclassの作り方
依然__init__が分からないが分かりやすい!
def __init__(self)は初期化する際に実行される特別な処理だと前回お話ししました。クラスからインスタンスを作成する際に、毎回この処理が呼び出されます。
-オブジェクト指向について学ぼう(2)
もう一声。
設計図(クラス)を実際にプログラム内で使う時は実体化(インスタンス化)が必要です。
その時に必ず最初に呼び出される特殊な関数(メソッド)です。
何故特殊かというと、他のメソッドは関数名を呼ぶ必要があるが、コンストラクタはクラス名を書くだけで勝手に呼び出されるから
基本的には、ここでオブジェクト生成のついでにデータの初期化を行います。
-__init__ってなに?Pythonのコンストラクタを理解したかった。
つまりこれによって、毎度毎度そのメソッドを呼び出すときに初期化する必要がなくなるということでしょうか(?)
どうやらこのコンストラクタはインスタンスを作成するときに自動で勝手に呼び出されるようです。
このような基礎知識は非常に重要な割に非常に勉強するのがつまらないところなので大変だと思いました。
熟練者の方々もし事実に反することを書いているようであればご指摘お待ちしています><


コメント