私が見ている問題を解決するのに少し問題があります。プログラム全体で使用される特殊な関数セットがあります。これらは基本的に、関数とメソッドを置き換えることができる動的呼び出し可能オブジェクトです。メソッドの機能をエミュレートするために適切に機能させる必要があるため、これらの関数はオーバーライド__get__
して、取得オブジェクトへのアクセスを提供するラップされたバージョンを提供します。
残念ながら、__get__
関数がインスタンスに直接設定されている場合は機能しません。これは、インスタンス__get__
の でキーが見つかった場合、「データ記述子」のみが関数を呼び出すためです。__dict__
頭に浮かぶ唯一の解決策は、これがデータ記述子であると考えるようにpythonをだますことです。これには__set__
、記述子での関数の作成が含まれます。理想的には、この__set__
関数がパススルーとして機能することを望みます (制御を呼び出し元に戻し、存在しないかのように評価を続けます)。
ディスクリプタがデータ ディスクリプタであると python に思わせる方法はありますが、それを含むクラス/インスタンスがその setattr コマンドを通常どおり使用できるようにする方法はありますか?
__getattribute__
また、呼び出し元のオーバーライドを使用してこれを行うことができることも承知しています。ただし、「オブジェクト」ビルトインとそれをオーバーライドするものに対してこれを行う必要があるため、これは悪い解決策です。正確には素晴らしい解決策ではありません。
あるいは、別の解決策があれば喜んでお聞きします。
問題の例を次に示します。
class Descriptor(object):
def __get__(self, obj, objtype = None):
return None
class Caller(object):
a = Descriptor()
print a
>>> None
x = Caller()
print a
>>> None
x.a = Descriptor()
print x.a
>>> <__main__.Descriptor object at 0x011D7F10>
一貫性を維持するために、最後のケースは「なし」と出力する必要があります。
記述子にa を追加する__set__
と、(必要に応じて) 'None' が出力されます。ただし、これにより、 xa = (何らかの値) のコマンドが以前のように機能しなくなります。この機能を台無しにしたくないので、これは役に立ちません。どんな解決策も素晴らしいでしょう。
訂正: 記述子の処理を少し誤解していたため、私の以前の考えはまだ機能しません。どうやら、記述子がクラスにまったくない場合、 set に関係なく呼び出されることはありません。私が持っていた条件は、dict val と同じ名前のクラス アクセサーがある場合にのみ役立ちます。私は実際には、http://blog.brianbeck.com/post/74086029/instance-descriptorsの行に沿ったソリューションを探していますが、太陽の下のすべてが特殊なインターフェースを継承することは含まれていません。
残念ながら、記述子インターフェイスのこの新しい理解を考えると、これは不可能かもしれません? なぜpythonはデコレータを本質的に非動的にするのでしょうか?