我正在学习烧瓶,现在我正在阅读烧瓶代码 我进入了一个我完全无法理解的街区。
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
对象?
它只是一个我现在需要记住的内在机制吗?
或者还有其他需要知道的事情吗?
答案 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__())
时,你首先执行该函数并打印方法返回的内容。