解释Django源代码

时间:2012-05-16 06:38:29

标签: python django lambda

我正在查看一些Django源代码并遇到this。究竟是什么:encoding = property(lambda self: self.file.encoding)做什么?

3 个答案:

答案 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 属性。