我正在查看一些 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/