0

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

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
4

1 回答 1

3

不知道为什么要这样做,但这是使用property装饰器的一种方法:

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

但这完全是荒谬的。它将实现您的示例尝试做的事情,但是当您访问Foo().x一个 lambda 函数时,它会返回,否则它是无用的。

如果您对返回自定义类的实例感到满意,那么您还可以为该自定义类提供一个__call__()简单地返回self以赋予.x()更多意义的方法:

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

换句话说,要么坚持.x成为属性、aproperty或方法,但不要试图同时成为全部。

于 2012-11-30T16:41:40.663 回答