鱼C论坛

 找回密码
 立即注册
查看: 1120|回复: 5

[已解决]救命,子类调用父类的super()语法

[复制链接]
发表于 2020-6-24 20:44:12 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
网上找的示例:
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)
最佳答案
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)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-24 20:46:57 | 显示全部楼层


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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-24 20:47:25 | 显示全部楼层
定义M错了,改成:
class M:
没有括号!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-24 20:48:51 | 显示全部楼层
xiaofeiyu 发表于 2020-6-24 20:47
定义M错了,改成:
没有括号!

类定义带不带括号都行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 12:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表