没有()可以调用python类属性吗?

时间:2012-11-30 16:37:49

标签: python class function attributes

我想做一些有点奇怪的事情。我希望能够访问可以作为非函数或函数访问的类属性:

class foo(object):
    def __init__(self):
        self.x = 99
    def x(self, *args, **kwargs ):
        print "x was called, args=%r, kwargs=%r" % (args, kwargs)
        return( self.x )  # return something useful here...

f = foo()
    print f.x  # prints "x was called", 99
    print f.x() # prints "x was called", 99

1 个答案:

答案 0 :(得分:3)

不知道为什么你想要这样做,但这是一种方式,使用property decorator

class Foo(object):
    @property
    def x(self):
        print "x was called"
        return lambda: None

但这完全无意义。它将实现您的示例尝试执行的操作,但是当您访问Foo().x时,将返回一个无用的lambda函数。

如果您可以返回自定义类的实例,那么您也可以为该自定义类提供一个__call__()方法,只需返回self即可赋予.x()更多含义:< / p>

class XReturnValue(object):
    def __call__(self):
        return self

class Foo(object):
    @property
    def x(self):
        print "x was called"
        return XReturnValue()

其中XReturnValue可以更加充实,实际上对Foo.x的用户意味着什么。

然而,在Python中,callables(例如函数和方法)本身就是对象。您可以操作它们,为它们添加属性,将它们分配给不同的变量供以后使用,等等。要获得它们的结果,您可以调用它们,但如果您不调用它们,则可以检索该引用以在其他地方重复使用。你不应该试图规避这一点。

换句话说,要么坚持使用.x作为属性,使用property或方法,又不要试图同时使用。{/ p>