breaki 发表于 2020-7-20 14:14:31

Python

class juxing:
      def __init__(self,width=0,height=0):
                self.width = width
                self.height = height
      def __setattr__(self,name,value):
                if name == 'square':
                  self.width = value
                  self.height = value
                else:
                  super().__setattr__(name,value)
      def getarea(self):
            return self.width*self.height
这个super调用基类是啥意思。。

Twilight6 发表于 2020-7-20 14:17:22

本帖最后由 Twilight6 于 2020-7-20 14:20 编辑



super().__setattr__(name,value) 这里严谨的说是调用父类的 __setattr__ 魔法方法,而不能说是基类

而因为你这里 juxing 类没有设置继承的类,所以 Python 默认你继承 object 类,也就是我们说的 基类

基类中有许多魔法方法,所以这里 super().__setattr__(name,value) 也就是调用基类的 __setattr__ 魔法方法

breaki 发表于 2020-7-20 14:22:44

Twilight6 发表于 2020-7-20 14:17
super().__setattr__(name,value) 这里严谨的说是调用父类的 __setattr__ 魔法方法,而不能说是基类

...

这样做有啥用。

Twilight6 发表于 2020-7-20 14:25:23

breaki 发表于 2020-7-20 14:22
这样做有啥用。

你重新 __setattr__魔法方法,原有的功能会全部被覆盖,如果你重新调用父类的方法,就可以将原有的功能保留下来

这里还有一个作用就是防止无限调用自身的 __setattr__ 魔法方法

breaki 发表于 2020-7-20 14:33:39

Twilight6 发表于 2020-7-20 14:25
你重新 __setattr__魔法方法,原有的功能会全部被覆盖,如果你重新调用父类的方法,就可以将原有的功能 ...

这里为啥不用写self,。

Twilight6 发表于 2020-7-20 14:35:12

breaki 发表于 2020-7-20 14:33
这里为啥不用写self,。

对于这个代码 super().__setattr__(name,value) 等价于 super(object,self).__setattr__(name,value)
页: [1]
查看完整版本: Python