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中的所有内容都是运行时; 没有单独的编译时间.
它们是同一类的两个不同实例.该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是因为它们是不同的方法.