私はtyping.NamedTuple
がPython 3.6で大好きです。しかし、多くの場合、namedtuple
にハッシュ可能でない属性が含まれており、dict
キーまたはset
メンバーとして使用したい場合がよくあります。 namedtuple
クラスがオブジェクトID(id()
の場合は__eq__
と__hash__
)を使用すると意味がある場合は、それらのメソッドをクラスに追加すると問題はありません。Typing.NamedTupleに特別なメソッド 'Mixin'を適用する方法
しかし、私は今、いくつかの場所で私のコードでは、このパターンを持っていると私は定型__eq__
と__hash__
メソッド定義を取り除きたいです。私はnamedtuple
のクラスが正規のクラスではないことを知っています。私はこれをどのように動作させるかを理解することができませんでした。ここで
は、私が試したものです:
from typing import NamedTuple
class ObjectIdentityMixin:
def __eq__(self, other):
return self is other
def __hash__(self):
return id(self)
class TestMixinFirst(ObjectIdentityMixin, NamedTuple):
a: int
print(TestMixinFirst(1) == TestMixinFirst(1)) # Prints True, so not using my __eq__
class TestMixinSecond(NamedTuple, ObjectIdentityMixin):
b: int
print(TestMixinSecond(2) == TestMixinSecond(2)) # Prints True as well
class ObjectIdentityNamedTuple(NamedTuple):
def __eq__(self, other):
return self is other
def __hash__(self):
return id(self)
class TestSuperclass(ObjectIdentityNamedTuple):
c: int
TestSuperclass(3)
"""
Traceback (most recent call last):
File "test.py", line 30, in <module>
TestSuperclass(3)
TypeError: __new__() takes 1 positional argument but 2 were given
"""
は、私は私が「オブジェクトID」を必要とする各NamedTuple
でこれらのメソッドを繰り返す必要はありません方法はありますか?
ObjectIdentityNamedTuplクラスの_init __()メソッドはどのようにしていますか? –
@DamianLattenero私は完全なコードの例を示すために私の質問を編集しました。 '__init__'はありません。私は '__new__'を追加しようとしましたが、' NamedTuple'は許されません。 –