鱼C论坛

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

[已解决]Python继承问题的super函数求助

[复制链接]
发表于 2020-9-22 22:49:04 | 显示全部楼层 |阅读模式

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

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

x
求高人指点,以下代码运行后,令line = Line(),运行后报错,需要我再次输入X1,Y1,X2,Y2的值,是不是super函数只继承父类的方法,而不继承结果呢?

import math

class Point():
    def __init__(self,X1,Y1,X2,Y2):
        self.X1 = X1
        self.Y1 = Y1
        self.X2 = X2
        self.Y2 = Y2
        print("A的坐标是%d,%d" % (self.X1,self.Y1))
        print("B的坐标是%d,%d" % (self.X2,self.Y2))
        
class Line(Point):
    def __init__(self):
        super().__init__()
        
    def getLen(self):
        AB_product = (self.X1 - self.X2)**2 + (self.Y1 - self.Y2)**2
        self.AB = math.sqrt(AB_product)
        print("直线AB的长是%d" % self.AB)
最佳答案
2020-9-23 09:06:04
给你写了注释,第三行是父类的初始化函数,需要四个参数。
在第13行的时候,你调用了父类的初始化函数,但是却没有给参数,所以就报错了
import math
class Point():
    def __init__(self,X1,Y1,X2,Y2):# 这里是父类的初始化函数,需要四个参数
        self.X1 = X1
        self.Y1 = Y1
        self.X2 = X2
        self.Y2 = Y2
        print("A的坐标是%d,%d" % (self.X1,self.Y1))
        print("B的坐标是%d,%d" % (self.X2,self.Y2))
        
class Line(Point):
    def __init__(self):
        super().__init__() # 这里调用父类的初始化函数,因父类初始化函数需要四个参数,所以这里必须传参,否则就会报错
        
    def getLen(self):
        AB_product = (self.X1 - self.X2)**2 + (self.Y1 - self.Y2)**2
        self.AB = math.sqrt(AB_product)
        print("直线AB的长是%d" % self.AB)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-22 23:17:16 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-22 23:18 编辑

你的Point()类里,就没给x,y传值
实例化line=Point()的时候也是报错,没传值,就没有结果

如果有传值,不就行了么?
import math
class Point():
    def __init__(self):
        self.X1 = 1
        self.Y1 = 2
        self.X2 = 3
        self.Y2 = 4
        print("A的坐标是%d,%d" % (self.X1, self.Y1))
        print("B的坐标是%d,%d" % (self.X2, self.Y2))


class Line(Point):
    def __init__(self):
        super().__init__()

    def getLen(self):
        AB_product = (self.X1 - self.X2) ** 2 + (self.Y1 - self.Y2) ** 2
        self.AB = math.sqrt(AB_product)
        print("直线AB的长是%d" % self.AB)
line=Line()
line.getLen()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-23 07:45:55 | 显示全部楼层
一:字类继承父类如果重写了 __init__,就会重写覆盖父类的 __init__ 方法
二:如果继承父类后用 super().__init__() 调用了超类方法,那么父类需要传的参数子类也要
三:如果在父类中给定了初始值,那么子类继承后可以传参,也可以不传参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-23 09:06:04 | 显示全部楼层    本楼为最佳答案   
给你写了注释,第三行是父类的初始化函数,需要四个参数。
在第13行的时候,你调用了父类的初始化函数,但是却没有给参数,所以就报错了
import math
class Point():
    def __init__(self,X1,Y1,X2,Y2):# 这里是父类的初始化函数,需要四个参数
        self.X1 = X1
        self.Y1 = Y1
        self.X2 = X2
        self.Y2 = Y2
        print("A的坐标是%d,%d" % (self.X1,self.Y1))
        print("B的坐标是%d,%d" % (self.X2,self.Y2))
        
class Line(Point):
    def __init__(self):
        super().__init__() # 这里调用父类的初始化函数,因父类初始化函数需要四个参数,所以这里必须传参,否则就会报错
        
    def getLen(self):
        AB_product = (self.X1 - self.X2)**2 + (self.Y1 - self.Y2)**2
        self.AB = math.sqrt(AB_product)
        print("直线AB的长是%d" % self.AB)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-23 11:10:12 | 显示全部楼层
import math
class Point():
    def __init__(self, X1, Y1, X2, Y2):  # 这里是父类的初始化函数,需要四个参数
        self.X1 = X1
        self.Y1 = Y1
        self.X2 = X2
        self.Y2 = Y2
        print("A的坐标是%d,%d" % (self.X1, self.Y1))
        print("B的坐标是%d,%d" % (self.X2, self.Y2))
    def doing(self):
        print('你很有钱吗?')

class Line(Point):
    def __init__(self,X1,Y1,X2,Y2):
        super().__init__(X1,Y1,X2,Y2)  # 这里调用父类的初始化函数,因父类初始化函数需要四个参数,所以这里必须传参,否则就会报错

    def getLen(self):
        AB_product = (self.X1 - self.X2) ** 2 + (self.Y1 - self.Y2) ** 2
        self.AB = math.sqrt(AB_product)
        print("直线AB的长是%d" % self.AB)
    def doing(self):
        print('我很有钱还学这干嘛。。。')

a =Point(1,2,3,4)
a.doing()
print('----------')
line=Line(5,6,7,8)
line.getLen()
line.doing()

子类里写入父类的4各参数后,ok的

父类和子类加入同样一个名字的函数,子类调用的时候,优先级是子类覆盖父类。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-9-23 21:04:13 | 显示全部楼层
感谢各位大佬的解答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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