zym297140058 发表于 2020-4-10 12:59:06

继承和super的问题

class ClassTest(object):
    __num = 0
    @classmethod
    def addNum(self):
      self.__num += 1
    @classmethod
    def getNum(self):
      return self.__num
   
    def __new__(self):
      ClassTest.addNum()
      return super(ClassTest,self).__new__(self)
   
class Student(ClassTest):
    def __init__(self):
      self.name = ''
         

a = Student()
b = Student()
ClassTest.getNum()

运行结果:
2


这个是网上看到一个例子,想一下关于继承的问题,Student继承了ClassTest,我弄不明白这个具体是怎么运行的,最主要是 return super(ClassTest,self).__new__(self) 这段代码不太懂,请大佬指点^_^

zltzlt 发表于 2020-4-10 13:01:48

return super(ClassTest,self).__new__(self) 可以理解为调用父类的 __new__ 方法,把 self 当做参数传递进去

zym297140058 发表于 2020-4-10 14:11:59

本帖最后由 zym297140058 于 2020-4-10 14:13 编辑

{:5_94:}

zym297140058 发表于 2020-4-10 14:12:46

zltzlt 发表于 2020-4-10 13:01
return super(ClassTest,self).__new__(self) 可以理解为调用父类的 __new__ 方法,把 self 当做参数传递进 ...

那a = Student()时候,在student类里面__num加过1,然后再调用父类的__new__方法的话__num不是还会+1吗

_荟桐_ 发表于 2020-4-11 07:38:24

return super(ClassTest,self).__new__(self)是去调用父类的__new__方法
如果直接是return self.__new__(self)
就会进入死循环,因为子类new方法调用了自身的new方法

zym297140058 发表于 2020-4-11 10:06:44

_荟桐_ 发表于 2020-4-11 07:38
return super(ClassTest,self).__new__(self)是去调用父类的__new__方法
如果直接是return self.__new__ ...

那调用父类的new之后父类的return super(ClassTest,self).__new__(self)不会再使用了吗

_荟桐_ 发表于 2020-4-11 11:41:37

zym297140058 发表于 2020-4-11 10:06
那调用父类的new之后父类的return super(ClassTest,self).__new__(self)不会再使用了吗

父类没有return super(ClassTest,self).__new__(self)语句
就像函数一样,如果你在函数里调用函数本身(就是只要执行了这个函数就会再调用函数本身的函数)
结果就是一直调用函数本身,死循环
例如:
def fun():
    return fun()
就会一直调用fun(),出不去
类也一样
页: [1]
查看完整版本: 继承和super的问题