python 3中的lambda如何处理参数引用?

时间:2016-05-13 09:27:17

标签: python lambda

我正在学习烧瓶,现在我正在阅读烧瓶代码 我进入了一个我完全无法理解的街区。

def implements_to_string(cls):
    cls.__unicode__ = cls.__str__
    cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
    return cls

@implements_to_string
class Test(object):
    def __init__ (self):
        pass

test = Test()
print(test.__str__)
print(test.__str__())

第一个印刷品将lambda方法显示为:

<bound method Test.<lambda> of <__main__.Test object at 0x7f98d70d1210>>

第二个:

<__main__.Test object at 0x7fcc4394d210>

那么func x中lambda中的implements_to_string何时成为cls对象?
它只是一个我现在需要记住的内在机制吗? 或者还有其他需要知道的事情吗?

1 个答案:

答案 0 :(得分:1)

来自文档:

  

可以使用lambda关键字创建小型匿名函数。此函数返回其两个参数的总和:lambda a, b: a+b。 Lambda函数可以在需要函数对象的任何地方使用。它们在语法上限于单个表达式。从语义上讲,它们只是正常函数定义的语法糖。

implements_to_string的实施与我在此处的相似:

def implements_to_string(cls):
    cls.__unicode__ = cls.__str__

    def lambda_func(self):
        return self.__unicode__().encode('utf-8')

    cls.__str__ = lambda_func
    return cls
  

那么func x中lambda中的implements_to_string何时成为cls对象?

当您使用print(test.__str__)时,您正在打印方法本身并打印其表示。

但是当你使用print(test.__str__())时,你首先执行该函数并打印方法返回的内容。