python class クラス



特殊メソッド

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のみだと・・?)
自分で定義した属性を使用できる。