2017-05-09 45 views
0

是否可以将@property函数存储在变量中?存储@property函数

假设我们有下面的代码:

class I: 
    def __init__(self): 
    self.i = 0 

    def get_i(self): 
    return self.i 

a = I() 

f_i = a.get_i 

print(f_i()) 

a.i = 3 

print(f_i()) 

我保存功能get_i一个变量中,并使用它。如预期的输出:

0 
3 

现在让我们看看相同的代码,但这次的@property功能:

class I: 
    def __init__(self): 
    self.i = 0 

    @property 
    def get_i(self): 
    return self.i 

a = I() 

f_i = a.get_i 

现在a.get_i不是功能了(这是值0) 。有什么方法可以将函数仍然存储在f_i变量中吗?

回答

2

property的整点在于它在访问时被调用。你必须绕过descriptor protocol来防止这种情况。然后

将其绑定到一个实例以后:

您可以通过访问property对象的类,而不是做这个

print(f_i.__get__(a)) 

或者你可以在访问fget getter函数将其绑定到a以创建绑定方法,并将结果存储以供稍后调用:

f_i = I.get_i.fget.__get__(a) 
print(f_i()) 

访问类的属性仍然调用描述符协议,但在这种情况下,property.__get__返回属性本身。

演示:

>>> a = I() 
>>> I.get_i 
<property object at 0x10efceb88> 
>>> I.get_i.__get__(a) 
0 
>>> I.get_i.fget 
<function I.get_i at 0x10efc3048> 
>>> I.get_i.fget.__get__(a) 
<bound method I.get_i of <__main__.I object at 0x10efd32e8>> 
>>> I.get_i.fget.__get__(a)() 
0 
+0

'I.get_i.fget .__获取__(一)'就是我正在寻找的。谢谢! – BlueSun