我正在查看一些 Django 源代码并遇到了这个。究竟是做什么的:encoding = property(lambda self: self.file.encoding)
做什么?
3 回答
它基本上是一个完整的包装吸气剂的简写。Expanded 看起来像这样,尽管它不是真正的 1-1 扩展。
def encoding(self):
return self.file.encoding
其他两个答案没有什么问题,但他们可能有点高级。所以这里是 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
.
它是一个代理从包含类访问它的file.encoding属性的属性。