我有一个带有属性方法的类:
class SomeClass(object):
@property
def some_method(self):
return True
我想调用 some_method 并将其存储为表达式。
例如:
some_expr = SomeClass().some_method
不应在 some_expr 中存储值 True ;而应该存储表达式 SomeClass()。some_method ,以便它是可调用的。
我该如何实现?
答案 0 :(得分:2)
注意,您基本上希望在属性实例上使用.__get__
callable。但是,这将需要一个实例作为第一个参数,因此您可以部分应用一些实例:
In [6]: class SomeClass(object):
...:
...: @property
...: def some_method(self):
...:
...: return True
...:
In [7]: from functools import partial
然后像:
In [9]: some_exp = partial(SomeClass.some_method.__get__, SomeClass())
In [10]: some_exp()
Out[10]: True
答案 1 :(得分:1)
以下是使属性可调用的一种方法:
class CallableProperty(object):
def __init__(self, instance, name):
self.instance = instance
self.name = name
def __call__(self):
return getattr(self.instance, self.name)
class SomeClass(object):
@property
def some_method(self):
return True
x = SomeClass()
y = CallableProperty(x, 'some_method')
print(y())
True
答案 2 :(得分:0)
执行此操作的简单方法是执行以下操作:
call_prop = lambda: SomeClass().some_prop
但没有充分的理由你需要这个。
答案 3 :(得分:0)
所以"财产"是一个描述符。这意味着它是一个对象(一切都是python中的一个对象),它定义了 get 方法。当你访问一个类属性时,如果那个对象有 get 方法,python会帮你调用它。该装饰器使用提供的函数并将其转换为分配给类的对象的 get (self)方法。太好了!
如果出于某种原因,你实际上想要函数而不是函数被调用,你可以通过类字典访问它...
f = SomeClass.__dict__['some_method'].__get__
如果" self"那将允许你f(1)
。方法并不重要。
如果你真的想要开心,你可以做new_f = functools.partial(f, SomeClass())
然后...... new_f() == True
真的很好奇你为什么要这样做;)