波大大12138 发表于 2020-6-23 20:24:07

上课代码看不懂求解答

[code
]class C:
    def __getattribute__(self,name):
      print('getattribute')
      return supper().__getattribute__(name)
    def __getattr__(self,name):
      print('getattr')
    def __setattr__(self,name,value):
      print('setattr')
      super().__setattr__(name,value)
    def __delattr__(self,name):
      print('delattr')
      supper().__delattr__(name)

在这个代码中有几个疑问看不懂。
1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?
2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?
3.举一个初始化的例子:c.x=1运行的出来的结果是setattr
                        之后c.x       运行出来的结果是getattribute
                                                                        1
可以结合上述初始化例子解答一下我上述的疑惑

波大大12138 发表于 2020-6-23 20:24:44

@Twilight6

Twilight6 发表于 2020-6-23 20:31:23

波大大12138 发表于 2020-6-23 20:24
@Twilight6


哈 你代码里面的 super 都多打了一个p 了 {:10_250:}

骚等 我看看问题哈

Twilight6 发表于 2020-6-23 20:44:33

1.在上述的四个方法当中为什么只有第一个方法有返回语句而其他的都没有返回?在第三和第四的方法中都和第一个方法一样最后调用了基类的方法为什么他们前面不加上return?

这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来的方法,也就是 __getattribute__

但是 __setattr__、__delattr__的主要作用是什么呢? 一个是用来设置属性的,一个是用来删除属性的,这些功能没有必要有返回值~ 所以无需设置返回值

2.第一个方法中最后的返回语句(return supper().__getattribute__(name))的必然性或者说他的作用是什么?不加可以吗?没有看出来最后加上的这个返回是返回给谁的并且返回的是什么?

不加不行哈,必须要调用父类的方法,因为我们这里重写了 __getattribute__ 导致 失去了原来的功能

而 __getattribute__ 功能是当你访问类中属性时候,就会自动触发,并返回该属性

当访问一个不存在类中的属性时候,__getattribute__会自动引发一个异常,而这个异常会被 __getattr__ 所捕获,如果你没有调用父类的方法,那么 __getattribute__也就不会有这些功能了

而我们重写的目的就是为了知道这些方法先后顺序,当然要保留功能的完整性

3.举一个初始化的例子:c.x=1运行的出来的结果是setattr
                        之后c.x       运行出来的结果是getattribute
                                                                        1
c.x 是为这个类设置属性嘛,所以 __setattr__ 会捕获你这个赋值时候的命令,来自动执行 __setattr__ 方法所以打印了 setattr

而 c.x 是访问你之前设置好了的属性 也就是说 这个属性是确实存在的 那么只要访问属性都会调用 __getattribute__

所以打印了 getattribute,后面的 1 是返回你 x 属性的值;而如果属性不存在还会自动调用 __getattr__ 方法

小甲鱼的铁粉 发表于 2020-6-23 20:46:14

Twilight6 发表于 2020-6-23 20:44
这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来 ...

马上就可以取领小甲鱼的全套书籍了{:10_256:}

波大大12138 发表于 2020-6-24 08:54:10

Twilight6 发表于 2020-6-23 20:44
这就要你先了解了解这些魔法方法的具体作用了,因为当你获取一个属性的时候,当然要有个能将值返回出来 ...

谢谢,很详细
页: [1]
查看完整版本: 上课代码看不懂求解答