python - 解读 Django 源代码

标签 python django lambda

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

最佳答案

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

lambda

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

A lambda expression is an anonymous function that can contain expressions and statements

大多数没有正式 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)的——您实际上永远不会直接访问该属性。相反,您访问的方法反过来会检索或操作属性。其中最主要的是获取 setter和getter 。顾名思义,它们是分别获取和设置属性值的方法。

现在,Python OOP 并没有真正意义上的 protected 或私有(private)属性的概念。您可以自由遵守规则,但没有什么能阻止您在类里面访问您想要的任何内容。因此,在 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 是类的常规属性一样。

在你提到的代码中,他们只是设置了一个 setter/getter ,但它的工作原理是一样的。 encoding 将充当类的属性并返回 file.encoding 的值。

关于python - 解读 Django 源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10613236/

相关文章:

c++ - 接受对任何类型的可变引用的 Lambda

c# - 理解这个 Lambda 表达式

python - 如何将这个字符串拆分成它的单个字符?

mysql - Django:添加整数字段后在应用程序上运行 makemigrations 时为 "Unknown Column"

Python 固定长度数据包

python - django 管道抛出 ValueError : the file could not be found

django - 如何补充父模板的 block ?

Java 8 流 - 合并映射并计算 "values"的平均值

python - 如何在 Python 和 R 之间交换 Msgpack 文件?

python - 使用 Python 串行读取 MATLAB 单曲