Xx_Nemesis_xX 发表于 2020-9-22 22:49:04

Python继承问题的super函数求助

求高人指点,以下代码运行后,令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-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()

小莫非 发表于 2020-9-23 07:45:55

一:字类继承父类如果重写了 __init__,就会重写覆盖父类的 __init__ 方法
二:如果继承父类后用 super().__init__() 调用了超类方法,那么父类需要传的参数子类也要
三:如果在父类中给定了初始值,那么子类继承后可以传参,也可以不传参
{:10_257:}{:10_257:}

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

rsj0315 发表于 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的

父类和子类加入同样一个名字的函数,子类调用的时候,优先级是子类覆盖父类。

Xx_Nemesis_xX 发表于 2020-9-23 21:04:13

感谢各位大佬的解答!
页: [1]
查看完整版本: Python继承问题的super函数求助