当前位置: 首页 > 面试题库 >

为什么方法与自身不同?

常子濯
2023-03-14
问题内容

关于is运算符的Python文档说:

运算符isis not对象标识测试:x is y当且仅当xy是相同对象时为true 。x is not y产生反真值。

让我们尝试一下:

>>> def m():
...   pass
... 
>>> m is m
True

在Python文档也说:

由于自动进行垃圾回收,释放列表以及描述符的动态性质,您可能会注意到在某些is运算符用法中,似乎存在异常行为,例如涉及实例方法或常量之间比较的行为。查看他们的文档以获取更多信息。

>>> class C:
...   def m():
...     pass
... 
>>> C.m is C.m
False

我搜索了更多的解释,但找不到任何解释。

为什么是C.m is C.m假的?

我正在使用Python2.x。如以下答案中所述,在Python 3.x中C.m is C.m是正确的。


问题答案:

当您请求一个实例的函数属性时,您将获得一个 绑定方法 :一个可html" target="_blank">调用对象,该对象包装了在类中定义的函数,并将实例作为第一个参数传递。在Python
2.x中,当您请求类的属性(即函数)时,会得到一个类似的代理对象,称为 未绑定方法

>>> class A: m = lambda: None
...
>>> A.m
<unbound method A.<lambda>>

这个特殊对象是在您需要时创建的,并且显然没有缓存在任何地方。那意味着当你做

>>> A.m is A.m
False

您正在创建两个 不同的 未绑定方法对象,并测试它们的身份。

注意

>>> x = A.m
>>> x is x
True

>>> A.m.im_func is A.m.im_func
True

工作正常。(im_func是未绑定方法对象包装的原始函数。)

顺便说一句,在Python 3.x中,它C.m is C.m是True,因为(几乎没有意义的)未绑定方法代理对象已被完全删除,而您只获得了定义的原始函数。

这只是Python属性查找非常动态的一个示例:当您请求对象的属性时,可以运行任意Python来计算该属性的值。这是另一个测试失败的示例,其中的原因更加清楚:

>>> class ChangingAttribute(object):
...     @property
...     def n(self):
...             self._n += 1
...             return self._n
...
...     def __init__(self):
...             self._n = 0
...
>>> foo = ChangingAttribute()
>>> foo.n
1
>>> foo.n
2
>>> foo.n
3
>>> foo.n is foo.n
False
>>> foo.n
6


 类似资料:
  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona

  • 我有以下代码,没有编译: 其中返回。 它不识别< code>asScala方法。将导入< code > Scala . JDK . future converters . _ 库。我做错了什么?

  • 问题内容: 我正在尝试扩展一些以填充屏幕,但是我很挣扎。我已经解决了这个jsfiddle的问题。 我真正想知道的是,当其父项具有相同的属性并且会扩展时,为什么100%的不会扩展到那个高度(或根本不扩展)? 问题答案: CSS 2.1规范涵盖了该问题: < 百分比> 指定百分比高度。相对于生成的盒子的包含块的高度计算百分比。如果未明确指定包含块的高度(即,它取决于内容的高度),并且该元素的位置不是绝

  • 问题内容: 我一直认为,在实现Runnable的java类中同步run方法是多余的。 我试图弄清楚为什么人们这样做: 这似乎是多余且不必要的,因为它们正在为另一个线程获取对象的锁。更确切地说,他们明确指出只有一个线程可以访问run()方法。但是由于它是run方法,它本身不是自己的线程吗?因此,只有它可以访问自身,并且不需要单独的锁定机制? 我在网上找到了一个建议,即通过同步运行方法,您可以通过以下

  • 问题内容: 另一个更新:已解决(请参阅评论和我自己的答案)。 更新:这就是我要解释的。 答:这是通过贝塞尔校正来解释的,而不是通过标准偏差公式的分母来解释的。我希望熊猫使用与numpy相同的约定。 有一个相关的讨论在这里,但他们的建议都不能工作。 我有许多不同餐厅的数据。这是我的数据框(想象不止一家餐厅,但效果只再现了一家): 问题:返回每个餐厅的价格均值。我想得到标准偏差。但是, 返回错误的值