この記事ではPythonのクラスと型ヒントについて解説していきます。
クラスを作成することで、同様のデータ形式や処理をまとめた型を作成することができます。クラスを使用してインスタンスを作成することで、同様の型のもの簡単に作成することができます。
型ヒントは、変数や関数での型を定義したものになります。
クラス
クラス定義
クラスを作成すると、同じ形式でインスタンスをいくつも作成することができます。
class ClassName(): ←クラス定義
処理
変数=ClassName() ←インスタンス化
# クラス定義
class User:
user_type = "human" # クラス変数
def __init__(self, name, age, address): # インスタンス変数
self.name = name
self.age = age
self.address = address
def greeting(self):
print("こんにちは!")
# クラス変数へはインスタンス作成前でもアクセス可
print(User.user_type)
# >>>human
# インスタンス化
user = User("鈴木太郎", 10, "東京都豊島区")
# インスタンス変数
print(user.name)
# >>>鈴木太郎
user.greeting()
# >>>こんにちは!
特殊メソッド/プロパティ化
特殊メソッドを定義することやメソッドを()なしで実行するプロパティ化を行うことができます。
__repr__ | インスタンス情報を返却する |
__len__ | インスタンスの文字列の長さを返却する |
__eq__ | インスタンス同士を比較する |
@property | メソッドをプロパティ化する |
# 特殊メソッド/プロパティ化
class User:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
def __repr__(self):
return f"id:{id(self)} name:{self.name}"
def __len__(self):
return len(self.name)
def __eq__(self, value):
return self.age == value.age
@property
def greet(self):
print(f"こんにちは、{self.name}です!")
# インスタンス化
user = User("鈴木太郎", 10, "東京都豊島区")
# __repr__
print(user)
# >>>id:2247695786368 name:鈴木太郎
# __len__
print(len(user))
# >>>4
# __eq__
user2 = User("山田花子", 15, "東京都港区")
user3 = User("佐藤一郎", 10, "東京都中央区")
print(user == user2)
print(user == user3)
# >>>False
# True
# プロパティ化
user.greet
# >>>こんにちは、鈴木太郎です!
dataclass
データをまとまって渡す場合など、効率的にデータをクラスで管理する場合に使用されます。
dataclassを使用するとクラス変数を使用でき、__repr__も自動で設定されます。
※dataclassを使用する場合は、型ヒントの設定は必須となります。
from dataclasses import dataclass, asdict, astuple
# クラス定義------------------
@dataclass
class User:
name: str
age: int
address: int
active: bool = False # 任意引数
user = User("太郎", 10, "東京都豊島区")
# インスタンス
print(user)
# >>>User(name='太郎', age=10, address='東京都豊島区', active=False)
# 辞書変換
print(asdict(user))
# >>>{'name': '太郎', 'age': 10, 'address': '東京都豊島区', 'active': False}
# タプル変換
print(astuple(user))
# >>>('太郎', 10, '東京都豊島区', False)
型ヒント
型ヒントとは
変数や関数の型を定義するもの、IDEなどで効率的に品質良くコーディングするために使用する。ただ、制限はなく、定義した型どおりに値を代入しなくてもエラーは発生しません。
・num : int
・def func(num : int) →str:
num:int=1
def func(num:int) -> int:
return num * 2
リストや辞書などでも同様に設定でき、かつ要素内の型も定義することができます。
li: list[str] = ["オレンジ", "イチゴ"]
di: dict[int:str] = {1: "アメ"}
Typingモジュール
typinigモジュールを使用することで、より詳細に型を定義することができます。
Union[int,str] | []内のいずれかを受け入れる |
Optical[int] | Noneと定義した型を受け入れる |
Literal[csv,txt,xlsx] | 左記と合致するものを受け入れる |
Any | どんな型でも受け入れる |
from typing import Union,Optional,Literal,Any
num: Union[int:str] = 1
num: int | str = 1
num: Optional[int] = None
num: Literal['csv','txt'] = 'sample.txt'
num: Any = 'こんにちは'
※Python3.10では、Typingモジュール「Union」を「num:int|str」で記述することができます。