杨东明 发表于 2021-7-21 18:59:18

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

class A:
    x = 666
    def __get__(self, instance, owner):
      print('get~')
      return A
    def __getattribute__(self, item):
      #print (self,'SELF')
      print('getattribute a')
      return super().__getattribute__(item)
class B:
    a = A()
    def __getattribute__(self, item):
      if item=='a':
            print('getattribute b')
      return super().__getattribute__(item)

b = B()
print(b.a.x)
'''   这是return A改成return self的结果
getattribute b
get~
getattribute a
666
'''

杨东明 发表于 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行不运行??

杨东明 发表于 2021-7-21 19:06:42

{:9_220:}

杨东明 发表于 2021-7-21 19:08:40

第二个问题,我这么理解是自己把自己说服了为啥__get__魔法方法不写return语句会报错:AttributeError: 'NoneType' object has no attribute 'x',如果理解有问题麻烦顺便给我讲解一下这个报错是咋回事,拜谢{:9_220:}

阿奇_o 发表于 2021-7-21 20:29:38

我怎么感觉得你一个劲地自己瞎搞呢? 自学的?没老师教?self还没搞清楚,就折腾这些特殊方法?

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

{:10_245:}

杨东明 发表于 2021-7-21 20:43:38

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

为什么 ...

看着小甲鱼的视频在学,视频里不是列了扩展阅读里面魔法方法的一张表嘛,我就说一个个试,试到__get__就卡了,一堆问题{:9_220:}

杨东明 发表于 2021-7-21 20:46:15

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

为什么 ...

我想的学基础把能弄懂的都弄懂,self我理解的就是传入的对象,像是实例对象.方法会自动传入自身做self,但是不是有__new__方法的参数会原封不动的传给__init__嘛,我就想这个是不是也是这个道理。。

杨东明 发表于 2021-7-21 20:49:05

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

为什么 ...

我也找了百度,解释的也看不懂,rnoob.com上没找到相关魔法方法的例子,{:9_220:}

kogawananari 发表于 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

杨东明 发表于 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 ,不会被打印吗??
页: [1]
查看完整版本: 请教一下这个代码中self的问题,实在没懂。。