我正在查看一些Django源代码并遇到this。究竟是什么:encoding = property(lambda self: self.file.encoding)
做什么?
答案 0 :(得分:4)
它基本上是全速包裹吸气剂的简写。扩展看起来像这样,虽然它不是真正的1-1扩展。
def encoding(self):
return self.file.encoding
答案 1 :(得分:4)
其他两个答案没有错,但它们可能有点高级别。所以这是101版本:
虽然它在C#的文档中,但我认为微软实际上对lambda的概念有最好的解释:
lambda表达式是一个可以包含的匿名函数 表达式和陈述
大多数没有正式CS学位的人都会超过lambda,但当你认为它只是一个“匿名函数”时,我认为它变得更容易理解。 Python中lambda的格式是:
lambda [argument]: [expression]
[argument]
可以是空的,单个参数或逗号分隔的参数列表和[expression]
本质上是方法体。这就是为什么@Jordan说你提到的代码大致相当于:
def encoding(self):
return self.file.encoding
self
是传递给方法的参数,方法的返回值(self.file.encoding
)是表达式。
property
方法允许您为类的属性创建“getters”和“setter”。在传统的OOP中,“成员”或类的属性通常设置为受保护或私有 - 您永远不会直接访问该属性。相反,您可以访问依次检索或操作属性的方法。其中最重要的是获得吸气剂和制定者。正如他们的名字所描述的那样,它们分别是获取和设置属性值的方法。
现在,Python OOP并没有真正意义上的受保护或私有属性的概念。你可以自由地遵守这些规则,但没有什么能阻止你在课堂上访问任何你想要的东西。因此,在Python中,getter和setter通常与property
一起用于“伪造”属性,因为缺少更好的单词。例如:
def get_foo(self):
return self.bar
def set_foo(self, value):
self.bar = value
foo = property(get_foo, set_foo)
有了这个,我现在可以做instance.foo
(无括号)和instance.foo = 'something'
之类的事情。它的工作原理就像foo
是该类的常规属性一样。
在你提到的代码中,它们只是设置一个getter,但它的工作方式相同。 encoding
将作为类的属性,并返回file.encoding
的值。
答案 2 :(得分:2)
property代理从包含类访问 file.encoding 属性。