使属性方法可调用

时间:2018-03-27 04:39:32

标签: python python-2.7 methods python-decorators

我有一个带有属性方法的类:

class SomeClass(object):

    @property
    def some_method(self):

        return True

我想调用 some_method 并将其存储为表达式。

例如:

some_expr = SomeClass().some_method

不应在 some_expr 中存储值 True ;而应该存储表达式 SomeClass()。some_method ,以便它是可调用的。

我该如何实现?

4 个答案:

答案 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

真的很好奇你为什么要这样做;)