ユーザ定義クラスの既存アルゴリズムへの適用

Pythonで、自分で作成したクラスを、例えばビルトイン関数に与えて、条件を満たすオブジェクトを見つけたい場合、新たに作成しないといけない。
例えば、


class A:
def __init__(self, id, val):
self.id = id
self.val = val

というクラスがあり、Aのシーケンスの中から最小のvalの値を持つオブジェクトのidが欲しいとする。


as = [A(1, 1), A(2, 2), A(3, 0), A(4, 4)]
# ここで、asを直接min()に入れられない!
id_of_min_val = min(as).id # id_of_min_valは、1になる

min()関数では、単純にシーケンスの要素の最小値を求めるので、そのまま入れると、オブジェクトのアドレス値の最小値になってしまうと思われる。
もちろん、以下のように


class A:
def __init__(self, id, val):
self.id = id
self.val = val
def __cmp__(self, other):
return self.val - other.val

という__cmp__()フックメソッドを定義すればOK。しかし、Aを汚したくない場合、これを外付けで与えたい。つまり、


id_of_min_val = min(as, lambda a: a.val).id

のように。しかし、これは、min()関数が、対応していないといけないし、Pythonは関数オーバーロードもできないので、解決できない。
class Aを一時的に拡張して、__cmp__()を定義したAのサブクラスを作成することもできるが、あまりおいしくない。


何かうまい方法があるのかぜひ知りたい…。