Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
class / __init__() / self
Pythonのクラスは『class』キーワードで定義します。『__init__()』はインスタンス生成時に呼ばれる初期化メソッドで、『self』は生成されたインスタンス自身を指します。selfは慣習的な名前で、第一引数に必ず指定しますが、Pythonが自動的に渡すためメソッド呼び出し時には書きません。
構文
class クラス名:
# クラス変数(全インスタンス共通)
クラス変数 = 値
def __init__(self, 引数):
# インスタンス変数(インスタンスごとに独立)
self.変数名 = 引数
def メソッド(self):
return self.変数名
特殊メソッド一覧
| 特殊メソッド | 概要 |
|---|---|
| __init__(self, ...) | インスタンス生成時に呼ばれる初期化メソッド。 |
| __str__(self) | str()やprint()で呼ばれる。人間向けの文字列表現を返す。 |
| __repr__(self) | repr()で呼ばれる。開発者向けの詳細な文字列表現を返す。 |
| __del__(self) | インスタンスが削除される直前に呼ばれるデストラクタ。 |
サンプルコード
# クラスの基本定義
class Person:
# クラス変数(全インスタンスで共通)
species = '人間'
count = 0
def __init__(self, name, age):
# インスタンス変数
self.name = name
self.age = age
Person.count += 1 # クラス変数を更新
def greet(self):
return f"こんにちは!{self.name}({self.age}歳)です。"
def birthday(self):
self.age += 1
return f"{self.name}は{self.age}歳になりました!"
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
def __repr__(self):
return f"Person('{self.name}', {self.age})"
def __del__(self):
Person.count -= 1
# インスタンスの生成
p1 = Person('田中', 30)
p2 = Person('鈴木', 25)
print(p1.greet()) # こんにちは!田中(30歳)です。
print(p2.birthday()) # 鈴木は26歳になりました!
print(Person.count) # 2(クラス変数はクラス名でアクセス)
print(p1.species) # 人間(インスタンスからもアクセス可能)
# __str__ と __repr__ の確認
print(str(p1)) # Person(name=田中, age=30)
print(repr(p1)) # Person('田中', 30)
print(p1) # Person(name=田中, age=30)(print()は__str__を使う)
# インスタンス変数とクラス変数の違い
p1.species = '地球人' # p1のインスタンス変数として追加(クラス変数は変わらない)
print(p1.species) # 地球人
print(p2.species) # 人間(クラス変数のまま)
print(Person.species) # 人間(クラス変数のまま)
# デフォルト引数を持つ__init__
class Circle:
PI = 3.14159
def __init__(self, radius=1.0):
self.radius = radius
def area(self):
return Circle.PI * self.radius ** 2
c1 = Circle(5)
c2 = Circle() # radiusはデフォルトの1.0
print(c1.area()) # 78.53975
print(c2.area()) # 3.14159
概要
クラス変数はクラスのすべてのインスタンスで共有されます。インスタンスから代入するとインスタンス変数として新しく作られ、クラス変数は変更されません。カウンターや設定値の共有にクラス変数を使う場合は、必ずクラス名経由でアクセスするようにしましょう。
『__str__()』は人間が読みやすい文字列を、『__repr__()』はデバッグ用の詳細な文字列を返すように設計します。__repr__()はeval()で元のオブジェクトを再現できる形式にすることが理想ですが、それが難しい場合は<クラス名 属性情報>の形式にするのが慣習です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。