ashlovemisty 发表于 2020-6-24 20:44:12

救命,子类调用父类的super()语法

网上找的示例:
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
def __test(self):
print("这是父类的私有方法")
def test(self):
self.__test()
print("这是父类的公有方法")
def setAge(self,age):
self.__age = age
def getAge(self):
return self.__age
class Student(Person):
def __init__(self,school,name,age):
super(Student, self).__init__(name=name,age=age)
self.school = school
def stuTest(self):
super().test()
print("所在学校为:",self.school)
stu = Student("一中","tom",12)
stu.stuTest()
print("学生的姓名是:",stu.name)
print("学生的年龄是:",stu.getAge())
=================================
运行正常,为什么我按一模一样的语法改成我的实例就会报错TypeError: object.__init__() takes exactly one argument (the instance to initialize)?
=================================
class M():
def __init__(self,a,b):
self.a=a
self.b=b
class X(M):
def __init__(self,a,b,c):
super(M, self).__init__(a=a,b=b)
self.c=c
d=X(1,1,1)
print(d.b)

Twilight6 发表于 2020-6-24 20:46:57



你这....完全没缩进了

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)


xiaofeiyu 发表于 2020-6-24 20:47:25

定义M错了,改成:class M:
没有括号!

Twilight6 发表于 2020-6-24 20:48:51

xiaofeiyu 发表于 2020-6-24 20:47
定义M错了,改成:
没有括号!

类定义带不带括号都行的

Twilight6 发表于 2020-6-24 20:52:09

本帖最后由 Twilight6 于 2020-6-24 21:00 编辑



super(M, self).__init__(a=a,b=b)

报错的原因是这条语句,你 super 填入 M 时候就表示调用的是 M 的父类 ,而你定义的 M类 没有设置继承哪个类,所以默认继承object 类

而 object 类的 __init__ 方法是没有设置传入参数的而你用 super 调用父类方法时候传入了 a、b 两个参数导致报错

改成这样即可:
class M():
    def __init__(self,a,b):
      self.a=a
      self.b=b

class X(M):
    def __init__(self,a,b,c):
      super(X,self).__init__(a=a,b=b)   # 相当于 super().__init__(a=a,b=b)
      self.c=c
d=X(1,1,1)
print(d.b)

你也可以这样写个类,这样 super(M,self).__init__(a=a,b=b) 这里就不会报错了,因为此时 M 的父类 T 的 __init__ 方法设置了两个参数

此时你 用 super 调用父类就不会报错了~ super里面填入的类,代表的调用该类的父类方法~
class T:
    def __init__(self,a,b):
      self.a = a
      self.b = b
      print('调用 T 的__init__方法')

class M(T):
    def __init__(self,a,b):
      print('调用 M 的__init__方法')

class X(M):
    def __init__(self,a,b,c):
      super(M,self).__init__(a=a,b=b)
      self.c=c
d=X(1,1,1)
print(d.b)

xiaofeiyu 发表于 2020-6-24 20:54:49

上代码吧:
class M:
        def __init__(self,a,b):
                self.a=a
                self.b=b
class X(M):
        def __init__(self,a,b,c):
                super().__init__(a=a,b=b)
                self.c=c

d=X(1,1,1)

print(d.b)
页: [1]
查看完整版本: 救命,子类调用父类的super()语法