2

私の質問は、バインドされたメソッド オブジェクトに関連しています。より具体的には、関数 (本質的には記述子) が示すのと同じ動作を模倣しようとしています。

class_instance.function() がどのように機能するかについての私の理解を最初にここに置きましょう

Class D(object):
    def dfunc(self):
        ...

d=D()
d.dfunc() # will call D.__dict__['dfunc'].__get__(d,D)()

#gives a bound method which can be used directly
a=D.__dict__['dfunc'].__get__(d,D) 
a() #works as d.D()

が関数でx がクラス インスタンスのD.__dict__['dfunc'] (d)場合、Python は を呼び出しますか?type(dfunc)type(d).__dict__['dfunc'].__get__(d, type(d))

クロージャーを使用してバインドされたオブジェクトを作成しようとしている方法について説明します。

class E(object):
    def __get__(self,obj,cls):

        def returned(*args):
            print(obj.__dict__)
        return returned

class F(object):
    e=E()
    y=9

f=F()
f.fvar=9 #putting something in instances __dict__
a=f.e #will call the __get__ function of F and return a closure
a() #works and produces instance specific result -> {'fvar': 9}, just like a bound method

type(a) を実行したときの主な質問a=D.__dict__['dfunc'].__get__(d,D)はバインドされたメソッドでしたが、実装するtype(a)と関数です。ユーザー定義の記述子からバインドされたオブジェクトを返す方法はありますか?

記述子のような関数を実装するより良い方法はありますか? 頭の中で何か根本的に間違っている場合は、訂正してください。

4

1 に答える 1

1

代わりにメソッドを返したい場合は、 に渡された引数と一緒に関数オブジェクトからメソッドを作成できます__get__

import types

class E(object):
    def __get__(self,obj,cls):

        def returned(*args):
            print(obj.__dict__)
        return types.MethodType(returned, obj, cls)

ただし、これによって何が得られるかは完全には明らかではありません。関数を返すだけで既に機能している場合、なぜそれを「実際の」メソッドにする必要があるのでしょうか?

于 2013-04-14T23:07:38.870 に答える