5

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

4

3 回答 3

4

它基本上是一个完整的包装吸气剂的简写。Expanded 看起来像这样,尽管它不是真正的 1-1 扩展。

def encoding(self):
    return self.file.encoding
于 2012-05-16T06:50:55.643 回答
4

其他两个答案没有什么问题,但他们可能有点高级。所以这里是 101 版本:

拉姆达

虽然它在他们的 C# 文档中,但我认为微软实际上对 lambda 的概念有最好的解释:

lambda 表达式是一个匿名函数,可以包含表达式和语句

大多数没有官方 CS 学位的人都会使用 lambda,但是当您将其视为简单的“匿名函数”时,我认为它变得更容易理解。Python 中 lambda 的格式为:

lambda [argument]: [expression]

where[argument]可以是任何东西,单个参数或逗号分隔的参数列表,[expression]本质上是方法体。这就是为什么@Jordan 说你提到的代码大致相当于:

def encoding(self):
    return self.file.encoding

self是传递给方法的参数,方法的返回值 ( self.file.encoding) 是表达式。

财产

基本上,该property方法允许您为类的属性创建“getter”和“setter”。在传统的 OOP 中,“成员”或类的属性通常设置为受保护的或私有的——您实际上永远不会直接访问该属性。相反,您访问的方法反过来检索或操作属性。其中最主要的是getter和setter。正如它们的名字所描述的那样,它们是分别获取和设置属性值的方法。

现在,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类的常规属性一样工作。

在您提到的代码中,他们只是设置了一个吸气剂,但它的工作原理是一样的。encoding将充当类上的属性并返回file.encoding.

于 2012-05-16T15:45:53.787 回答
2

它是一个代理从包含类访问它的file.encoding属性的属性。

于 2012-05-16T06:43:02.893 回答