我的问题与绑定方法对象有关,更具体地说,我试图模仿与函数(基本上是描述符)相同的行为。
首先让我理解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)
是函数;有没有办法从用户定义的描述符返回绑定对象?
有没有更好的方法来实现像描述符这样的函数? 如果我脑子里有一些根本不正确的东西,请纠正我。
答案 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)
然而,并不完全清楚这会让你获益。如果只是返回一个函数已经有效,为什么你需要它才能成为一个“真正的”方法呢?