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()

Python 是否调用D.__dict__['dfunc'] (d), 以防何时type(dfunc)是函数且type(d).__dict__['dfunc'].__get__(d, type(d))x 是类实例?

现在来谈谈我如何尝试使用闭包创建绑定对象:

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

现在的主要问题是,当我做a=D.__dict__['dfunc'].__get__(d,D)type(a) 时是绑定方法,但是当我实现它时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 回答