Python 解释Django源代码

Python 解释Django源代码,python,django,lambda,Python,Django,Lambda,我在浏览Django的一些源代码时发现了它。具体做什么:encoding=property(lambda-self:self.file.encoding)做什么?它是一个代理从包含类访问它的file.encoding属性。它基本上是完整包装的getter的缩写。Expanded看起来像这样,虽然它不是真正的1-1扩展 def encoding(self): return self.file.encoding 其他两个答案没有问题,但可能有点高层次。下面是101版: 兰姆达 尽管在C#的

我在浏览Django的一些源代码时发现了它。具体做什么:
encoding=property(lambda-self:self.file.encoding)
做什么?

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

它基本上是完整包装的getter的缩写。Expanded看起来像这样,虽然它不是真正的1-1扩展

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

其他两个答案没有问题,但可能有点高层次。下面是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
方法允许您为类上的属性创建“getter”和“setter”。在传统的OOP中,“成员”或类的属性通常设置为protected或private——您实际上从未直接访问该属性。相反,您可以访问反过来检索或操作属性的方法。这些人中的头号人物将是能手和二传手。正如它们的名字所描述的,它们是分别获取和设置属性值的方法

现在,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
将像类上的属性一样,返回
文件的值。encoding

代理访问是什么意思?@HighLife它将self.encoding的访问转发到self.file.encoding。为什么这不是真正的1-1扩展?因为从技术上讲,属性是属性,而不是方法。Python的编译器在幕后发挥了神奇的作用,使它看起来像一个属性(属性),而不是一个可调用的方法。@HighLife,因为您需要将其称为
obj.encoding()
不只是使用属性访问
obj.encoding
你可以在那里放一个
@property
装饰器,我认为如果你把
@property
放在
def