鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: lingedu

[已解决]关于类方法的知识求解

[复制链接]
发表于 2020-7-8 20:38:05 | 显示全部楼层
本帖最后由 Stubborn 于 2020-7-8 21:25 编辑

is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。

最重要的一点,classmethod装饰器的调用等同于Object().method()

其过程可以看做这样
  1. # 这里是两次打印ID
  2. print(id(Pizza.get_radius))
  3. print(id(Pizza.get_radius))

  4. # 这里是使用 is 判断
  5. a = Pizza()
  6. b = Pizza()
  7. 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就很容易看出来了吧

  1. class Pizza(object):
  2.     radius = 42

  3.     @classmethod
  4.     def get_radius(cls):
  5.         return cls.radius

  6.     def test(self): pass


  7. print(id(Pizza().test))
  8. print(id(Pizza.test))
  9. aa = Pizza.test
  10. bb = Pizza.test
  11. print(id(aa))
  12. print(aa is bb)
  13. print(aa is Pizza.test)


  14. print("装饰器方法")
  15. print(id(Pizza.get_radius))
  16. print(id(Pizza().get_radius))
  17. a = Pizza.get_radius
  18. print(id(a))
  19. # 以上三个ID是完全一样,正常来说,使用is盘判断,肯定是True。
  20. # 但是出现False 说明是重新申请的内存,就像这样
  21. # b = Pizza.get_radius
  22. # 赋值等同于ID传递引用。
  23. print(a is Pizza.get_radius)
  24. print(a is Pizza().get_radius)
  25. b = Pizza.get_radius
  26. print(id(b))
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-8 21:07:25 | 显示全部楼层
Stubborn 发表于 2020-7-8 20:38
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。

最重要的一 ...


Pizza().get_radius   Pizza.get_radius  括号加不加都一样


不一样,不是同个对象,虽然 id 相同,但是是因为Python 为保证该对象在其生命周期内是惟一的和常量。

具有不重叠生存期的两个对象可能具有相同的id()值。你去看下你楼上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-8 21:23:11 | 显示全部楼层
Twilight6 发表于 2020-7-8 21:07
不一样,不是同个对象,虽然 id 相同,但是是因为Python 为保证该对象在其生命周期内是惟一的和常 ...

我是说使用方式。

print( id(["22"]), id(["33"])) ,这两个ID也都相同的

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 14:23:09 | 显示全部楼层
Twilight6 发表于 2020-7-8 20:24
又去查了一堆资料,终于有一点眉目了,看看Python官方文档怎么说 id() 函数的:
  1. class A:
  2.         def __init__(self,x):
  3.                 self.x = x
复制代码

结果:

  1. >>> print(id(A(5)))
  2. 2311861943552
  3. >>> print(id(A(5)))
  4. 2311861943552
  5. >>> print(id(A(54)))
  6. 2311861943552
  7. >>> print(id(A(23)))
  8. 2311861943552
  9. >>>
复制代码

很正确,不同实例对象只要不进行变量赋值,直接查id都是一样的,所以应该用is更准些吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 14:24:22 | 显示全部楼层
Stubborn 发表于 2020-7-8 20:38
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。

最重要的一 ...

相当正确,解释的太好了,感谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-9 14:25:19 | 显示全部楼层
Twilight6 发表于 2020-7-8 20:24
又去查了一堆资料,终于有一点眉目了,看看Python官方文档怎么说 id() 函数的:

楼下的大佬跟你的意思也是差不多,太深奥了,感谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-9 14:30:20 | 显示全部楼层    本楼为最佳答案   
lingedu 发表于 2020-7-9 14:23
结果:

很正确,不同实例对象只要不进行变量赋值,直接查id都是一样的,所以应该用is更准些吧

因为你的问题,我也 GET 到了新的知识哈哈~互相学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-2 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表