|
发表于 2020-7-8 20:38:05
|
显示全部楼层
本帖最后由 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))
复制代码
|
|