Pythonオブジェクトとクラス実践ガイド
Pythonオブジェクトとクラス
このチュートリアルでは、Pythonの核心的なオブジェクト指向機能を探り、クラス作成、インスタンス化、堅牢なコードのためのベストプラクティスをガイドします。
動画:Pythonクラスとオブジェクト
Pythonオブジェクトとクラス
Pythonは根本的にオブジェクト指向です。手続き型プログラミングが関数に焦点を当てるのに対し、OOPはデータと振る舞いをバンドルしたオブジェクトを中心とします。
オブジェクトは属性(データ)とメソッド(関数)の束です。クラスはオブジェクトの構造を定義する設計図です。
クラスを家の設計図と考えましょう—部屋、ドア、窓を詳細に記述。そこから建てられる各家屋がオブジェクト、つまりインスタンスです。
同じクラスから複数のオブジェクトを構築できます。インスタンス化はクラスからオブジェクトを作成するプロセスです。
Pythonでのクラス定義
クラス定義はclassキーワードで始まり、関数がdefで始まるのと同様です。クラス内の最初の文字列はドックストリングで、簡潔な説明を提供します。
class MyNewClass:
'''This is a docstring. I have created a new class'''
pass
クラス定義はその属性のための新しい名前空間を確立し、データやメソッドとなり得ます。ダブルアンダースコアで始まる特殊属性(__doc__など)はドックストリングなどのメタデータを保持します。
定義後、クラスオブジェクトが作成され、属性アクセスや新オブジェクトのインスタンス化に使用できます。
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# 出力: 10
print(Person.age)
# 出力: <function Person.greet>
print(Person.greet)
# 出力: "This is a person class"
print(Person.__doc__)
出力
10 <function Person.greet at 0x7fc78c6e8160> This is a person class
Pythonでのオブジェクト作成
クラスはオブジェクトのファクトリとして機能します。インスタンス化は関数呼び出しに似ています:
>>> harry = Person()
結果のオブジェクトharryはドット記法でクラス属性にアクセスできます。クラスメソッドはインスタンス上で束縛メソッドになります。
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# Personクラスの新オブジェクト作成
harry = Person()
# 出力: <function Person.greet>
print(Person.greet)
# 出力: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)
# オブジェクトのgreet()メソッド呼び出し
# 出力: Hello
harry.greet()
出力
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
メソッド定義のselfパラメータに注目。メソッドがインスタンスで呼び出されると、Pythonは自動的にインスタンスを第1引数として渡すため、harry.greet()はselfを明示的に渡さずに実行できます。
慣習的にselfを使用しますが、構文上は任意の名前が有効です。この慣習に従うことで可読性が向上し、コミュニティ標準に準拠します。
Pythonのコンストラクタ
ダブルアンダースコアで始まる特殊メソッドは特別な役割を果たします。インスタンス化時に呼び出される__init__メソッドはコンストラクタとして機能し、インスタンス状態を初期化します。
class ComplexNumber:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# 新しいComplexNumberオブジェクト作成
num1 = ComplexNumber(2, 3)
# get_data()メソッド呼び出し
# 出力: 2+3j
num1.get_data()
# 別のComplexNumberオブジェクト作成
# 動的属性'attr'を追加
num2 = ComplexNumber(5)
num2.attr = 10
# 出力: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# 存在しない属性アクセスでエラー
print(num1.attr)
出力
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'
この例は、属性を個別インスタンスに動的に追加しても他インスタンスに影響しないことを示しています。
属性とオブジェクトの削除
del文で属性を削除可能。クラスメソッドや属性を削除すると以降の呼び出しに影響します。
>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'get_data'
オブジェクト自体も削除可能。参照を削除すると名前が解放され、他の参照がなければガベージコレクションで自動的に回収されます。
>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
... NameError: name 'c1' is not defined
Pythonではメモリ管理が参照カウントと循環ガベージコレクタにより処理され、効率的なリソースクリーンアップを保証します。

Python
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- Python キーワードと識別子: 予約語と命名規則をマスター
- Python 文・インデント・コメント: 明確なガイド
- Pythonディレクトリ・ファイル操作マスター:作成、移動、一覧、リネーム、削除
- Pythonカスタム例外マスター:実践ガイド
- Python継承マスター:概念、構文、実践例