Python 使属性方法可调用
我有一个带有属性方法的类:Python 使属性方法可调用,python,python-2.7,methods,python-decorators,Python,Python 2.7,Methods,Python Decorators,我有一个带有属性方法的类: class SomeClass(object): @property def some_method(self): return True 我想调用某个\u方法,并将其存储为表达式 例如: some_expr = SomeClass().some_method 不应将值True存储在某些表达式中;而是应该存储表达式SomeClass().someu方法,以便它可以调用 如何实现这一点?以下是使属性可调用的一种方法: 代码: 测试
class SomeClass(object):
@property
def some_method(self):
return True
我想调用某个\u方法,并将其存储为表达式
例如:
some_expr = SomeClass().some_method
不应将值True存储在某些表达式中;而是应该存储表达式SomeClass().someu方法,以便它可以调用
如何实现这一点?以下是使属性可调用的一种方法: 代码: 测试代码: 结果:
一个简单的方法是执行以下操作:
call_prop = lambda: SomeClass().some_prop
In [9]: some_exp = partial(SomeClass.some_method.__get__, SomeClass())
In [10]: some_exp()
Out[10]: True
但是没有什么好的理由让你需要它。所以“属性”是一个描述符。这意味着它是一个定义了get方法的对象(python中的一切都是对象)。当您访问一个类属性时,如果那里的对象有get方法,python将帮助您调用它。该装饰器接受提供的函数,并将其转换为分配给类的对象上的get(self)方法。太好了
如果出于某种原因,您确实希望调用函数而不是函数,那么您可以通过类字典访问它
f=SomeClass.\uuuuu dict\uuuuuu['some\u method']。\uuuuu get\uuuuuu
如果“self”方法不重要的话,这将允许您执行f(1)
如果你真的想变得有趣,你可以做new\u f=functools.partial(f,SomeClass())
然后new_f()==True
我真的很好奇你为什么要这么做;) 注意,您基本上希望在属性实例上使用可调用的
。\uuuuu get\uuuuu
。但是,这需要一个实例作为第一个参数,因此您可以部分应用某个实例:
In [6]: class SomeClass(object):
...:
...: @property
...: def some_method(self):
...:
...: return True
...:
In [7]: from functools import partial
然后是:
call_prop = lambda: SomeClass().some_prop
In [9]: some_exp = partial(SomeClass.some_method.__get__, SomeClass())
In [10]: some_exp()
Out[10]: True
为什么?它的计算结果总是
True
,除非你真的搞砸了这个类。另外,我觉得最简单的方法就是不使用属性。我的意思是,一个属性的全部要点是,你不必调用它,但它可以动态生成,看起来像一个成员变量。我想,同样,你为什么要这样做?
In [9]: some_exp = partial(SomeClass.some_method.__get__, SomeClass())
In [10]: some_exp()
Out[10]: True