使用描述符实现绑定方法

时间:2013-04-14 22:55:47

标签: python descriptor

我的问题与绑定方法对象有关,更具体地说,我试图模仿与函数(基本上是描述符)相同的行为。

首先让我理解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()

如果D.__dict__['dfunc'] (d)是函数,Python会调用type(dfunc)吗?如果x是类实例,那么Python会调用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

现在主要问题, 当我a=D.__dict__['dfunc'].__get__(d,D)类型(a)是绑定方法时,但是当我实现它时type(a)是函数;有没有办法从用户定义的描述符返回绑定对象?

有没有更好的方法来实现像描述符这样的函数? 如果我脑子里有一些根本不正确的东西,请纠正我。

1 个答案:

答案 0 :(得分:1)

如果要返回一个方法,可以从函数对象中创建一个方法以及传递给__get__的参数:

import types

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

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

然而,并不完全清楚这会让你获益。如果只是返回一个函数已经有效,为什么你需要它才能成为一个“真正的”方法呢?