默认参数的python函数

2024-06-16 11:14:26 发布

您现在位置:Python中文网/ 问答频道 /正文

如何访问方法内的qux?我真的必须在foo()的主体中重新定义它,还是有方法从self导入它?在

class Baz(object):

    qux = lambda x : x + '_quux'

    def foo(self, bar=qux('fred')):
        print bar

        print qux('waldo')
        # NameError: global name 'qux' is not defined

        print Baz.qux('waldo')
        # TypeError: unbound method <lambda>() must be called with Baz instance as first argument (got str instance instead)

        print Baz.qux(self, 'waldo')
        # TypeError: <lambda>() takes exactly 1 argument (2 given)

        print self.qux('waldo')
        # TypeError: <lambda>() takes exactly 1 argument (2 given)                

Tags: 方法instancelambdaselffoobarbazargument
3条回答

qux被视为实例方法,因为这是看起来像函数的类成员的默认处理方式(更具体地说,Baz.qux有一个{},当您通过实例查找时,它被隐式调用来将第一个参数“绑定”到实例)。但是,您在开始时没有提供self参数。相应地,baz被绑定到xlambda参数。在

Python中“self”这个名字没有什么神奇之处;它只是约定。方法绑定总是通过绑定到函数的第一个参数来实现的。在

如果你聪明的话,你可以亲眼看到:

class Baz(object):
    qux = lambda x: x + '_quux'
    def foo(self): return self.qux()

Baz().foo() # TypeError: unsupported operand type(s) for +: 'Baz' and 'str'
# because after binding Baz() to 'x', we get Baz() + '_quux'

一种解决方案是显式地使quxastaticmethod,如svenmarnach的答案所示。(您也可以将其设为classmethod,这是一个特定于Python的概念,功能更强大;staticmethod与Java等语言中的static关键字的行为非常相似。)请注意,与Java一样,您还可以在foo内将staticmethod作为self.qux来访问。这是通过用staticmethod安装的新机器来替换功能的正常__get__机器。在

另一种解决方案是在lambda参数中提供self参数。如果你真的不想要“静态”行为(即需要用self做点什么),这很有用,但看起来你确实需要这样做。为了完整起见,这看起来像:

^{pr2}$

一个解决方案是使用

qux = staticmethod(lambda x : x + '_quux')

并将其作为

^{pr2}$

我就把它从教室里搬出去。在

如果您想从类中访问方法,那么必须使用^{}^{}。在

class Baz(object):
  qux = staticmethod(lambda x : x + '_quux')

但是don't do that。在

相关问题 更多 >