【问题标题】:Is it possible to have a python class attribute be callable without ()是否可以在没有 () 的情况下调用 python 类属性
【发布时间】:2012-11-30 16:37:49
【问题描述】:

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

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

【问题讨论】:

  • 你为什么要这样做? Stort 答案:您可以使用返回无操作 lambda 的属性。
  • 我想让这个类的用户能够访问带有或不带参数的“x”。是的,他们会做 f.x() 但我只是好奇是否可以将 f.x 案例与 f.x() 案例相同对待。让我补充一点问题...

标签: python class function attributes


【解决方案1】:

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

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 用作属性、property 或方法,但不要试图同时成为所有对象。

【讨论】:

  • 你说我可以做我想做的,但不会返回任何有用的东西。我太新手了,不明白为什么会这样......
  • @staggart:因为 python 中的对象要么是可调用的,要么不是。函数或方法是可调用的;如果你想让它做一些你做的事情,那就打电话给它。如果你不调用它,你就有一个对可调用对象的引用,如果你调用它,你就会得到调用的结果。无论是否调用都返回结果与此相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2013-12-18
  • 2019-06-16
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多