2017-08-15 3 views
-1

私はクラスインスタンスのマジックメソッドを呼び出す方法を探しています。私の場合は、プロパティに基づいてクラスにハッシュを呼び出す必要があります。私はメタクラスで解決策を見つけましたが、メタクラスのメソッドからクラスプロパティにアクセスすることはできません。クラスの自己マジックメソッド

class X(type): 
    @classmethod 
    def __hash__(cls): 
     return hash(cls.x) 
class Y(metaclass=X): 
     x = (1, 2, 3) 
assert hash(Y) == hash((1, 2, 3)) 

私はちょうどこのスレッドを見つけました:Defining magic methods on classes

+0

"メタクラスのメソッドからクラスプロパティにアクセスできません" - 何ですか?できますよ。 – user2357112

+2

なぜクラスオブジェクトのハッシュをオーバーライドしたいのですか?あなたは今、 '__eq__'を実装する義務があります。 – wim

答えて

2

@classmethodオフを取ります。

あなたが __hash__Xのインスタンスである Yを、受信したい
class X(type): 
    def __hash__(self): 
     return hash(self.x) 
class Y(metaclass=X): 
     x = (1, 2, 3) 
assert hash(Y) == hash((1, 2, 3)) 

Xを受け取ることは望ましくありません。