特殊メソッド
CustomClass(hoge)
def __call__(self, y):
return self.x + y
ハッシュ値を持たせる
def __hash__(self)
return hash(hoge)
なお、set()等で処理する際は、同ハッシュかつ、同値(__eq__)で、判定される。
同ハッシュでも、統合不成立であれば、別の値として集合で扱える。
コンストラクタと初期化
def __new__(cls)
def __init__(self, *args, **kwargs)
インスタンスを作成するときは、new(インスタンスを返す)が呼ばれた後、init(インスタンスを初期化する)が呼ばれる。
newの使いどころは、以下のようなものらしい。(https://illumination-k.dev/techblog/post/9da1ffd1-a76f-410b-a2d9-a44bb98b1f88)
インスタンスではなくクラスそのものに興味があるとき(何回呼ばれたか、そのクラスのインスタンスの存在有無とか)
イミュータブルなクラス変数の定義
継承元を利用して生成するクラスを動的に選択する
ジェネレータを作成する
for文などのループでオブジェクトを処理したいとき、__iter__メソッドを実装してイテレート可能なものにするか、yield文を用いたジェネレータを使用することで実現できる。
ループで回すオブジェクトの全容を表しやすいときはイテレーター、そうでないときはジェネレータと使い分けるとよい。
次のインスタンスを登録しておく
class A:
def __init__(self, next, name):
self.next = next
def __next__(self):
if self.next is None:
raise StopIteration()
return self.next
def chain(self):
yield self
try:
for a in next(self).chain():
yield a
except StopIteration:
pass
a1 = A(None, 1)
a2 = A(a1, 2)
a3 = A(a2, 3)
for a in a3.chain():
print(a)
"次"感をだすためにnext()関数を使っている。
next()関数を使ってるので、__next__を実装している。
抽象メソッド
定義
from abc import ABCMeta, abstractmethod
class Hoge(object, metaclass=ABCMeta):
pass
抽象メソッドかつクラスメソッド
@classmethod
@abstractmethod
def hoge(cls):
pass
例外処理
例外処理には、独自エラーを定義できる。
デフォでmessage引数を取得する。
別の引数を使用して、戻り値として渡すことも可能。
class RuleError(Exception):
def __init__(self, message='', cells=set()) -> None:
super().__init__(message)
self.cells = cells
try:
hoge()
except RuleError as rule_error:
print(rule_error)
error_rules = rule_error.cells
messageを表示するには、そのままprintすれば出力される。
(これだと、テンプレートごと出力される。messageのみだと・・?)
自分で定義した属性を使用できる。