为什么"是"运算符说这些方法不一样?

11 python identity class object python-3.x

考虑以下代码:

class Person(object):
   def sayHello(self):
       return 'Hello'

print(Person().sayHello is Person().sayHello)
Run Code Online (Sandbox Code Playgroud)

我希望它能显示出真实.为什么显示False?

Kas*_*mvd 15

方法在运行时绑定到实例.当您运行以下代码时:

print(Person().sayHello is Person().sayHello)
Run Code Online (Sandbox Code Playgroud)

您创建两个实例,每次有不同的内存地址.

>>> Person().sayHello
<bound method Person.sayHello of <__main__.Person object at 0x7fbe90640410>>
>>> Person().sayHello
<bound method Person.sayHello of <__main__.Person object at 0x7fbe90640490>>
Run Code Online (Sandbox Code Playgroud)

注意:Python中的所有内容都是运行时; 没有单独的编译时间.

  • [如果你有一个实例,你仍然会*得到'False`,因为你在每次访问时都得到一个新的方法对象.](http://stackoverflow.com/questions/15977808/why-dont-methods-有-引用相等) (10认同)
  • 并且*在Python中是*单独的编译时间.例如,名称范围在编译时确定.并且各种文字被转换为常量,并且在编译时应用窥孔优化.不适用于此处但不声称它不存在. (4认同)

Rem*_*ich 5

它们是同一类的两个不同实例.该sayHello功能是绑定的方法.

也就是说,如果你有一个类实例:

p = Person()
Run Code Online (Sandbox Code Playgroud)

并在其上查找属性:

p.sayHello
Run Code Online (Sandbox Code Playgroud)

然后Python首先查看实例的实际属性,如果它没有在那里找到属性,它会查看该类.如果它找到该名称的类方法,则将其转换为绑定到此实例的绑定方法.这是导致对象实例作为第一个参数(self)传递的魔力sayHello.

因此Person().sayHello is Person().sayHello创建两个实例,根据在类上定义的相同方法创建两个不同的绑定方法,因此is返回False是因为它们是不同的方法.

  • 即使在相同的实例上,每次访问时都会重新创建方法.这里有两个传出实例并不重要. (2认同)