我想做一些有点奇怪的事情。我希望能够访问可以作为非函数或函数访问的类属性:
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
答案 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>