李晓鹏 发表于 2020-6-8 17:53:43

求助 super()应用

>>> class Counter:
      k = []
      def __init__(self):
                self.counter = 0
      def __setattr__(self, name, value):
                if name != 'counter':
                        if name not in self.k:
                              self.counter += 1
                              self.k.append(name)
                super().__setattr__(name, value)
      def __delattr__(self, name):
                self.counter -= 1
                self.k.remove(name)
                super().__delattr__(name)

请问上述代码中的 super().__setattr__(name, value)和super().__delattr__(name)有什么作用?实在是看不懂!

xiaosi4081 发表于 2020-6-8 17:55:37

super(类名, self)就是调用父类的函数,下面就是调用了父类的__setattr__函数
def __setattr__(self, name, value):
                if name != 'counter':
                        if name not in self.k:
                              self.counter += 1
                              self.k.append(name)
                super().__setattr__(name, value)

qiuyouzhi 发表于 2020-6-8 17:59:09

因为你的__setattr__没有达到应该的效果,所以需要用父类的方法来达到效果。

Twilight6 发表于 2020-6-8 18:05:47

super() 就是调用父类原有的方法嘛
因为你重写 __setattr__ 和 __delattr__ 会覆盖父类原有的这个方法的功能,而我们目的并不是全部重写,只是增加了一些功能,比如你这:def __setattr__(self, name, value):
                if name != 'counter':
                        if name not in self.k:
                              self.counter += 1
                              self.k.append(name)
如果单纯这样写,不用super调用就会失去原有的功能,设置变量,而你重新调用了父类的方法,就等于你重写的这个方法不仅附带父类的功能还有自己新的功能

李晓鹏 发表于 2020-6-8 19:39:50

谢谢啦,还有点不明白的是:并不是所有的魔法方法被修改完都要使用super()调用父类,什么时候需要用super()调用呢?什么时候又不需要? 比如下面这个代码又不用在重写完__setattr__后使用supper(),但却可以实现目标效果。

def __setattr__(self, name, value):
      self.__dict__ = value + 1
页: [1]
查看完整版本: 求助 super()应用