jump_p 发表于 2020-6-1 16:59:50

45讲第3题

>>> class C:
      def __getattr__(self, name):
                print(1)
                return super().__getattr__(name)
      def __getattribute__(self, name):
                print(2)
                return super().__getattribute__(name)
      def __setattr__(self, name, value):
                print(3)
                super().__setattr__(name, value)
      def __delattr__(self, name):
                print(4)
                super().__delattr__(name)

               
>>> c = C()
>>> c.x

像这样 return super().__getattribute__(name) 的语句,调动基类的方法是干啥用的?

Twilight6 发表于 2020-6-1 17:02:25

学的真快   {:10_275:}

jump_p 发表于 2020-6-1 17:04:59

Twilight6 发表于 2020-6-1 17:02
学的真快

所以知道问题的答案吗{:10_291:}

Twilight6 发表于 2020-6-1 17:05:02

super().__getattribute__(name)   基类可以说就是父类
继承 父类的 __getattribute__ 方法,这边返回等于直接使用父类方法进行返回

Twilight6 发表于 2020-6-1 17:10:13

jump_p 发表于 2020-6-1 17:04
所以知道问题的答案吗

为什么我在另一个帖子一直被审核,这个帖子不会

jump_p 发表于 2020-6-1 17:11:03

Twilight6 发表于 2020-6-1 17:10
为什么我在另一个帖子一直被审核,这个帖子不会

你我有缘{:10_297:}

Twilight6 发表于 2020-6-1 17:12:43

jump_p 发表于 2020-6-1 17:11
你我有缘

{:10_330:}可以可以

jump_p 发表于 2020-6-1 17:14:19

Twilight6 发表于 2020-6-1 17:05
super().__getattribute__(name)   基类可以说就是父类
继承 父类的 __getattribute__ 方法,这边返回等于 ...

我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但是写了这句,会返回啥?比如c = C(),c.x,先调用__getattribute__(),返回2,然后执行return super().__getattribute__(name),找不到x,为啥就会执行 __getattr__返回1呢?

Twilight6 发表于 2020-6-1 17:21:14

jump_p 发表于 2020-6-1 17:14
我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但 ...

但是写了这句,会返回啥?
__getattribute__ 作用是访问属性时候会自动调用,用于获取其属性
__getattr__ 就是当属性找不到时候调用 返回一个值,或者报错

Twilight6 发表于 2020-6-1 17:22:29

jump_p 发表于 2020-6-1 17:14
我又重新理解了一下,有点懂了。如果这里不写return super().__getattribute__(name),则会返回None。但 ...

就是因为找不到 x 所以会执行 __getattr__

jump_p 发表于 2020-6-1 17:28:48

Twilight6 发表于 2020-6-1 17:22
就是因为找不到 x 所以会执行 __getattr__

我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__getattr__呀,但是没有执行),只有加了return super().__getattribute__(name)才执行了__getattr__。如果这句的意思是按照父类的方法返回,那么__getattr__是__getattribute__的父类?

Twilight6 发表于 2020-6-1 17:32:36

本帖最后由 Twilight6 于 2020-6-1 17:34 编辑

jump_p 发表于 2020-6-1 17:28
我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__get ...

我也记混了,太久没温习魔法方法了

__getattribute__ 通过实例访问属性,被调用。
如果class中定义了__getattr__(),则__getattr__()不会被调用除非显示调用或引发AttributeError异常

Twilight6 发表于 2020-6-1 17:35:59

jump_p 发表于 2020-6-1 17:28
我试了一下,如果不写return super().__getattribute__(name),就只会返回2(按道理找不到x也会执行__get ...

那么__getattr__是__getattribute__的父类
他们都属于方法,没有父子类之分,当你 没有特别指明的 类都默认 继承 object 类,也就是基类,基类中有 __getattr__和__getattribute__ 方法

jump_p 发表于 2020-6-1 17:49:17

Twilight6 发表于 2020-6-1 17:35
他们都属于方法,没有父子类之分,当你 没有特别指明的 类都默认 继承 object 类,也就是基类,基类 ...

魔法方法真的太折磨人了,似懂非懂,先这么着吧{:10_266:}

Twilight6 发表于 2020-6-1 17:51:23

jump_p 发表于 2020-6-1 17:49
魔法方法真的太折磨人了,似懂非懂,先这么着吧

等等我晚上如果有时间的话就回去重新温习下看下能不能解释清楚给你听

jump_p 发表于 2020-6-1 17:53:31

Twilight6 发表于 2020-6-1 17:51
等等我晚上如果有时间的话就回去重新温习下看下能不能解释清楚给你听

{:10_297:}太感谢了

Twilight6 发表于 2020-6-1 17:54:09

jump_p 发表于 2020-6-1 17:53
太感谢了

没事,就是要负责点 不然对不起你的最佳

jump_p 发表于 2020-6-1 18:48:05

Twilight6 发表于 2020-6-1 17:54
没事,就是要负责点 不然对不起你的最佳

我隐约觉得是对_getattribute__进行了重写,所以要还原一下的意思。

Twilight6 发表于 2020-6-1 18:49:31

jump_p 发表于 2020-6-1 18:48
我隐约觉得是对_getattribute__进行了重写,所以要还原一下的意思。

你觉得是没错的super 就是重新继承 __getattribute__ 原有的方法,只是你在原来的 __getattribute__ 加了print 变成了新的__getattribute__ 方法

jump_p 发表于 2020-6-1 19:03:38

Twilight6 发表于 2020-6-1 18:49
你觉得是没错的super 就是重新继承 __getattribute__ 原有的方法,只是你在原来的 __getattribute__ 加 ...

嗯嗯, 就是说__getattribute__能够在属性不存在的情况下自动调用__getattr__,所以加了 return super().__getattribute__(name)重新继承后才能返回1
页: [1] 2
查看完整版本: 45讲第3题