11

正確さのためにインスタンス属性をバイパスすることに加えて、暗黙の特殊メソッドルックアップは通常__getattribute__()、オブジェクトのメタクラスであってもメソッドをバイパスします。

ドキュメントには、、、などの特別なメソッドが記載されて__hash__おり__repr____len__経験から、Python2.7にも含まれていることがわかり__iter__ます。

関連する質問への回答を引用するには:

「魔法__methods__()は特別に扱われます。検索を高速化するために、タイプデータ構造の「スロット」に内部的に割り当てられ、これらのスロットでのみ検索されます。」

別の質問への回答を改善するために、私は知る必要があります。具体的には、どの方法について話しているのでしょうか。

4

2 に答える 2

4

のpython3ドキュメントで答えを見つけることができます。これには、次のようobject.__getattribute__に記載されています。

クラスのインスタンスの属性アクセスを実装するために無条件に呼び出されます。クラスも定義している場合、明示的に呼び出すか、AttributeErrorを発生させ__getattr__()ない限り、後者は呼び出されません。__getattribute__()このメソッドは、(計算された)属性値を返すか、AttributeError例外を発生させる必要があります。このメソッドでの無限再帰を回避するために、その実装では常に同じ名前の基本クラスメソッドを呼び出して、オブジェクトなどの必要な属性にアクセスする必要があります。__getattribute__(self, name)

ノート

言語構文または組み込み関数を介した暗黙的な呼び出しの結果として、特別なメソッドを検索する場合でも、このメソッドはバイパスされる可能性があります。特別なメソッドルックアップを参照してください。

また、このページでは、この「機械」がどのように機能するかを正確に説明しています。基本的には、 (ドット)演算子__getattribute__を使用して属性にアクセスした場合にのみ呼び出されます( Zagorulkinが指摘したように)。.hasattr

このページでは、暗黙的に検索される特別なメソッドが指定されていないことに注意してください。したがって、これはすべてのメソッドに当てはまると思います(ここにあります) 。

于 2012-10-25T07:36:59.370 に答える
2

2.7.9でチェックイン

__getattribute__またはにある魔法のメソッドのいずれかを使用して、への呼び出しをバイパスする方法が見つかりませんでしobjecttype

# Preparation step: did this from the console
# magics = set(dir(object) + dir(type))
# got 38 names, for each of the names, wrote a.<that_name> to a file
# Ended up with this:

a.__module__
a.__base__
#...

これをそのファイルの先頭に置き、名前を適切なpythonモジュール(asdf.py)に変更しました

global_counter = 0

class Counter(object):
    def __getattribute__(self, name):
        # this will count how many times the method was called
        global global_counter
        global_counter += 1
        return super(Counter, self).__getattribute__(name)

a = Counter()
# after this comes the list of 38 attribute accessess
a.__module__
#...
a.__repr__
#...

print global_counter  # you're not gonna like it... it printer 38

getattrそれから私はまたそれらの名前のそれぞれをそしてhasattr->同じ結果を得ようとしました。__getattribute__毎回呼び出されました。

ですから、他のアイデアがあれば...私は怠惰すぎてCコードの内部を調べることができませんでしたが、答えはどこかにあると確信しています。

だから、私が正しくないことがあるか、ドキュメントが嘘をついているかのどちらかです。

于 2015-01-05T01:09:39.257 に答える