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