4

__int__このようなことができるように、Python クラスのような関数をオーバーライドしたいとしましょう。

class A(object):
    def __init__(self):
        self.__int__ = lambda: 1

a = A()
print int(a)

このエラーメッセージを生成する代わりに、ここに「1」を出力することを期待しています

TypeError: int() 引数は、'A' ではなく、文字列または数値でなければなりません

代わりに__int__、クラスに組み込まれたメソッドになると、期待どおりに機能します。なんで?(この問題は、二重アンダースコア関数のいずれにも存在します)

4

2 に答える 2

3

それは__魔法のメソッドのもう 1 つの魔法のようです。他のメソッドとは異なり、暗黙的に呼び出されたときにクラス インスタンスを検索しません。

それらが魔法の方法で解決されないことは十分に文書化されています(そして、それ自体の名前を解決するために自分自身を呼び出さなければならないので、解決された__getattribute__場合、それは素晴らしいパラドックスになります)。__getattribute__しかし、インスタンスをチェックしないと驚かされます。

ここでは、「Special Method Lookup」というヘッダーの下で少し説明しています: http://segfaulthunter.github.io/articles/biggestsurprise/

新しいスタイルのクラスのインスタンスの場合、暗黙的に行われるすべての特別なメソッド ルックアップは、クラス構造体で行われます。したがって、インスタンスの__str__属性を変更しても、str() の結果には影響しません。それでも、インスタンスから属性を明示的に取得すると、インスタンス内のメソッドが得られます。

他の誰かがより詳細な説明を提供できるかどうかを知りたいと思います。

于 2013-11-03T06:32:01.027 に答える