【发布时间】:2014-10-26 04:26:39
【问题描述】:
(我编辑了这个问题,因为我认为它基本上仍然是我要问的问题,尽管我从 cmets 获得了一些理解。我不知道这是否允许,或者我应该问一个新的.)
以下代码
class A: c = lambda:0
a = A()
print(a.c is a.c)
打印 False。我知道这是因为 Python 认为 A.c 是一种方法,因为 c 在类级别被分配了一个函数。我有两个问题:
(不太重要)Python 如何判断某事物是否为函数?我认为如果它要成为一种方法,就必须明确定义它。 “任意可调用”显然不是标准:例如,不接受内置函数。
(更重要的是)我了解到“每当您通过 class.name 或 instance.name 查找方法时,都会创建一个新的方法对象”。有任何独立于实现的原因吗?也就是说,如果不制作副本,是否有任何语言功能无法正常工作? (当然,我知道a1.c不是a2.c,但是对于同一个对象a,ac是否总是同一个对象?或者至少,Ac总是同一个对象?)
【问题讨论】:
-
@IgnacioVazquez-Abrams 好的,抱歉。我认为以非平凡方式控制属性访问的任何东西都可以称为描述符。尽管如此,问题仍然存在:发生了什么以及如何解释它?
-
所以,毕竟有描述符。 :-) 无论如何,是的,这回答了一些问题(如果您假设对 c 的访问通过描述符而对 b 的访问不通过),但提出了两个新问题:为什么 c 会通过描述符而 b 不会,以及为什么会描述符协议复制它检索到的东西?
-
因为
b不是方法。 -
当然可以,但 c 也不是。还是这样?
标签: python python-3.x lambda copy descriptor