本帖最后由 Stubborn 于 2020-7-8 21:25 编辑
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。
最重要的一点,classmethod装饰器的调用等同于Object().method()
其过程可以看做这样# 这里是两次打印ID
print(id(Pizza.get_radius))
print(id(Pizza.get_radius))
# 这里是使用 is 判断
a = Pizza()
b = Pizza()
print(a.get_radius is b.get_radius)
Pizza().get_radius Pizza.get_radius 括号加不加都一样(Ps:调用方法都是一样,但是对象不是一样的,为什么ID会相同呢,在Python里面,未命名的相同类型的Python对象具有相同的ID,刚刚看到的),Pizza().get_radius is Pizza().get_radius这个为什么是False就很容易看出来了吧
class Pizza(object):
radius = 42
@classmethod
def get_radius(cls):
return cls.radius
def test(self): pass
print(id(Pizza().test))
print(id(Pizza.test))
aa = Pizza.test
bb = Pizza.test
print(id(aa))
print(aa is bb)
print(aa is Pizza.test)
print("装饰器方法")
print(id(Pizza.get_radius))
print(id(Pizza().get_radius))
a = Pizza.get_radius
print(id(a))
# 以上三个ID是完全一样,正常来说,使用is盘判断,肯定是True。
# 但是出现False 说明是重新申请的内存,就像这样
# b = Pizza.get_radius
# 赋值等同于ID传递引用。
print(a is Pizza.get_radius)
print(a is Pizza().get_radius)
b = Pizza.get_radius
print(id(b))
|