鱼C论坛

 找回密码
 立即注册
查看: 2136|回复: 9

请教一下这个代码中self的问题,实在没懂。。

[复制链接]
发表于 2021-7-21 18:59:18 | 显示全部楼层 |阅读模式
15鱼币
  1. class A:
  2.     x = 666
  3.     def __get__(self, instance, owner):
  4.         print('get~')
  5.         return A
  6.     def __getattribute__(self, item):
  7.         #print (self,'SELF')
  8.         print('getattribute a')
  9.         return super().__getattribute__(item)
  10. class B:
  11.     a = A()
  12.     def __getattribute__(self, item):
  13.         if item=='a':
  14.             print('getattribute b')
  15.         return super().__getattribute__(item)

  16. b = B()
  17. print(b.a.x)
  18. '''   这是return A改成return self的结果
  19. getattribute b
  20. get~
  21. getattribute a
  22. 666
  23. '''
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 19:05:24 | 显示全部楼层
码下我的问题:1.return self ,和第十五行的return语句为啥print打印没东西,就是没返回值不是改打印个none吗?
2.我是理解的b.a.x他的触发流程是先__get___,__get__的返回值会传递给下一个__getattribute__做self,但是我改了return self 为return A后,不知道为什么七八行代码不运行了,但是__getattribute__最后一行正常运行,返回了666?(return A程序运行结果:getattribute b
get~
666)请问我之前理解的思路错了吗?return A为啥78行不运行??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 19:06:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 19:08:40 | 显示全部楼层
第二个问题,我这么理解是自己把自己说服了为啥__get__魔法方法不写return语句会报错:AttributeError: 'NoneType' object has no attribute 'x',如果理解有问题麻烦顺便给我讲解一下这个报错是咋回事,拜谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-21 20:29:38 | 显示全部楼层
我怎么感觉得你一个劲地自己瞎搞呢? 自学的?没老师教?self还没搞清楚,就折腾这些特殊方法?

为什么不先找教程,找例子,先搞清楚基本概念,再搞这些特殊方法(又或者,现阶段你有必要深究这些吗)?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 20:43:38 | 显示全部楼层
阿奇_o 发表于 2021-7-21 20:29
我怎么感觉得你一个劲地自己瞎搞呢? 自学的?没老师教?self还没搞清楚,就折腾这些特殊方法?

为什么 ...

看着小甲鱼的视频在学,视频里不是列了扩展阅读里面魔法方法的一张表嘛,我就说一个个试,试到__get__就卡了,一堆问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 20:46:15 | 显示全部楼层
阿奇_o 发表于 2021-7-21 20:29
我怎么感觉得你一个劲地自己瞎搞呢? 自学的?没老师教?self还没搞清楚,就折腾这些特殊方法?

为什么 ...

我想的学基础把能弄懂的都弄懂,self我理解的就是传入的对象,像是实例对象.方法会自动传入自身做self,但是不是有__new__方法的参数会原封不动的传给__init__嘛,我就想这个是不是也是这个道理。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-21 20:49:05 | 显示全部楼层
阿奇_o 发表于 2021-7-21 20:29
我怎么感觉得你一个劲地自己瞎搞呢? 自学的?没老师教?self还没搞清楚,就折腾这些特殊方法?

为什么 ...

我也找了百度,解释的也看不懂,rnoob.com上没找到相关魔法方法的例子,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-22 00:44:52 | 显示全部楼层
你在A.get里面返回什么  B.a就是什么  
你要求b.a.x   就是求(B.a).x  就是求的(A.get里return的东西).x  
所以我才提议return self 不然x拿不到

至于__getattribute__就是一个递归的搅屎棍方法
从来没用过 但是只要定义了就一定先被执行
返回如果是None再才有其他的  
几乎99%的方法__getattribute__没定义
也就是你super().__getattribute__估计也没定义返回的None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-22 16:35:33 | 显示全部楼层
kogawananari 发表于 2021-7-22 00:44
你在A.get里面返回什么  B.a就是什么  
你要求b.a.x   就是求(B.a).x  就是求的(A.get里return的东西).x   ...

那这个return self ,不会被打印吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 12:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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