コンテンツにスキップ

クラス

クラスの基本

下記のクラスを例に説明します。

class User:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def hello(self) -> None:
        print(f"こんにちは、私は{self.name}です!")

コンストラクタ

コンストラクタは__init__ (1) で定義します。

  1. Dunder(ダンダー)メソッドの一つです。
class User:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def hello(self) -> None:
        print(f"こんにちは、私は{self.name}です!")

第一引数のself(1)は必須です。自身のインスタンスオブジェクトが入ります。

  1. 変数名はselfでなくとも動作しますが、慣習としてselfを使います。

第二引数以降は任意で、関数同様に任意の引数を定義できます。任意引数も定義できます。

インスタンス変数

クラスの変数(プロパティ)は、selfに対して任意の箇所で代入して行います。

class User:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def hello(self) -> None:
        print(f"こんにちは、私は{self.name}です!")

インスタンス化は、コンストラクタに指定する引数を与えます。

taro = User("Taro", 21)

インスタンスのプロパティには.でアクセスできます。

print(taro.name)  # => 'Taro'
print(taro.age)  # => 21

インスタンス変数のスコープ

メソッド(インスタンスメソッド)

メソッドは第一引数にselfを指定します。

class User:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def hello(self) -> None:
        print(f"こんにちは、私は{self.name}です!")

メソッドも.で呼び出します。

taro.hello()  # => 'こんにちは、私はTaroです!'

クラス変数、クラスメソッド

以下のクラスを例に解説します。

class User:
    instance_count: int = 0

    def __init__(self) -> None:
        self.instance_count += 1

    @classmethod
    def print_instance_count(cls) -> str:
        print(f"インスタンスの生成数は{cls.instance_count}個です")

クラス変数の定義

クラス変数は、クラスの直下に{変数名} = {初期値}の形で定義します。

class User:
    instance_count: int = 0

    def __init__(self) -> None:
        self.instance_count += 1

    @classmethod
    def print_instance_count(cls) -> str:
        print(f"インスタンスの生成数は{cls.instance_count}個です")

クラス変数へのアクセス

クラス変数は、インスタンスからアクセスすることができます。値はクラス全体で共有されます。

class User:
    instance_count: int = 0

    def __init__(self) -> None:
        self.instance_count += 1

    @classmethod
    def print_instance_count(cls) -> str:
        print(f"インスタンスの生成数は{cls.instance_count}個です")

クラスから直接アクセスすることもできます。

User.instance_count # => 0

クラスメソッドの定義

クラスメソッドは@classmethodのアノテーションをつけたメソッドとして定義します。

class User:
    instance_count: int = 0

    def __init__(self) -> None:
        self.instance_count += 1

    @classmethod
    def print_instance_count(cls) -> str:
        print(f"インスタンスの生成数は{cls.instance_count}個です")

第一引数のcls(1)は必須です。自身のクラスオブジェクトが入ります。

  1. 変数名はclsでなくとも動作しますが、慣習としてclsを使います。

cls.{クラス変数名}でクラス変数にアクセスできます。

スタティックメソッド

インスタンスメソッド、クラスメソッド、スタティックメソッドの使い分け

継承