鱼C论坛

 找回密码
 立即注册
查看: 19511|回复: 12

TypeError: __init__() missing 2 required positional arguments: 'x1' and 'y1'

[复制链接]
发表于 2018-5-28 07:16:44 | 显示全部楼层 |阅读模式

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

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

x
  1. import math

  2. class Point1:
  3.     def __init__(self, x1, y1):
  4.         self.x1 = x1
  5.         self.y1 = y1
  6.         
  7. p = Point1(2, 2)

  8. class Point2:
  9.     def __init__(self, x2, y2):
  10.         self.x2 = x2
  11.         self.y2 = y2

  12. p = Point2(4, 4)



  13. class Line(Point1, Point2):

  14.     def __init__(self):
  15.         super().__init__()
  16.         
  17.     def get_len(self):
  18.         square = (self.x2 - self.x1)*(self.x2 - self.x1) + (self.y2 - self.y1)*(self.y2 - self.y1)
  19.         line = math.sqrt(square)
  20.         print(self.line)

  21. l = Line()
  22. l.get_len()
复制代码



#报错内容
  1. Traceback (most recent call last):
  2.   File "E:\my option\python\038题目.py", line 192, in <module>
  3.     l = Line()
  4.   File "E:\my option\python\038题目.py", line 185, in __init__
  5.     super().__init__()
  6. TypeError: __init__() missing 2 required positional arguments: 'x1' and 'y1'
复制代码


#我已经用super()函数加载了Point1,Point2的属性,怎么出现了类型错误啊?传入的y1和x1都是int类型呀,怎么是TypeError了呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-28 08:45:30 | 显示全部楼层
hi 原因如下

  1. import math

  2. class Point1:
  3.     def __init__(self, x1, y1):
  4.         self.x1 = x1
  5.         self.y1 = y1
  6.         
  7. p1 = Point1(2, 2) #和下面重名了

  8. class Point2:
  9.     def __init__(self, x2, y2):
  10.         self.x2 = x2
  11.         self.y2 = y2

  12. p2 = Point2(4, 4)#重名了,需要修改



  13. class Line():

  14.     #def __init__(self): #这个__init__没有什么实际作用,建议删除
  15.         #super().__init__()
  16.         
  17.     def get_len(self,p1,p2): #get_len存在代码逻辑错误,已修改
  18.         square = (p2.x2 - p1.x1)*(p2.x2 - p1.x1) + (p2.y2 - p1.y1)*(p2.y2 - p1.y1)
  19.         self.line = math.sqrt(square)
  20.         print(self.line)

  21. l = Line()  
  22. l.get_len(p1,p2) #需要加入参数
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 09:13:06 | 显示全部楼层
1 第8行和第15行定义的p变量冲突,15行的覆盖的第8行的,改为p1,p2

2 逻辑冗余,直接定义一个point类即可

3 对Line进行init的时候传入point对象才比较合理

修改代码如下,供lz参考:
  1. import math

  2. class Point:
  3.     def __init__(self, x, y):
  4.         self.x = x
  5.         self.y = y   


  6. class Line():
  7.     def __init__(self,p1,p2):
  8.         self.p1 = p1
  9.         self.p2 = p2
  10.         
  11.     def get_len(self):
  12.         square = (self.p2.x - self.p1.x)*(self.p2.x - self.p1.x) + \
  13.                  (self.p2.y - self.p1.y)*(self.p2.y - self.p1.y)
  14.         self.line = math.sqrt(square)
  15.         print(self.line)


  16. p1 = Point(2, 2)
  17. p2 = Point(4, 4)
  18. l = Line(p1,p2)  
  19. l.get_len()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-5-28 11:32:59 | 显示全部楼层
init方法在子类中没有传递足够数量的参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 12:20:26 | 显示全部楼层
ABC23 发表于 2018-5-28 11:32
init方法在子类中没有传递足够数量的参数

平方根的算法都忘了,初中学的年份久了,都需要温习啊,上面总结的挺好的,慢慢看了。

你说的是如果init方法在子类中传递足够数量的参数就代码就没问是吗?还是init方法中的super函数根本就不能用,我还是慢慢看吧,仔细思考一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 15:28:30 | 显示全部楼层
BngThea 发表于 2018-5-28 09:13
1 第8行和第15行定义的p变量冲突,15行的覆盖的第8行的,改为p1,p2

2 逻辑冗余,直接定义一个point类即 ...

Point类里面的x,y是怎么和Line类里面的p1,p2联系到一起的呀?我找了一下没有他们之间的关系啊,运行的话能能运行,但是理解不了啊。怎么联系的跟我说一下呗,不太懂啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 15:42:38 | 显示全部楼层
BngThea 发表于 2018-5-28 09:13
1 第8行和第15行定义的p变量冲突,15行的覆盖的第8行的,改为p1,p2

2 逻辑冗余,直接定义一个point类即 ...

啊,看到了,是实例化的时候有联系啊,刚才看糊涂了,自己再看看,分析一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 16:31:59 | 显示全部楼层
本帖最后由 大地0725 于 2018-5-28 16:38 编辑


import math

class Point1:
    def __init__(self, x1, y1):
        self.x1 = x1
        self.y1=y1
        
p1=Point1(2,2)     

class Point2:
    def __init__(self, x2, y2):
        self.x2 = x2
        self.y2 = y2

p2=Point2(4,4)

class Line():

    def __init__(self,p1,p2):
         super().__init__()
        
    def get_len(self):
        square = (p2.x2 - p1.x1)*(p2.x2 - p1.x1) + (p2.y2 - p1.y1)*(p2.y2 - p1.y1)
        print(p1.x1,p1.y1,p2.x2,p2.y2)
        self.line = math.sqrt(square)
        print(self.line)


l =Line(p1,p2)
l.get_len()

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 16:40:54 | 显示全部楼层
请问发python代码,怎么设置格式?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 17:25:50 | 显示全部楼层
大地0725 发表于 2018-5-28 16:40
请问发python代码,怎么设置格式?

https://jingyan.baidu.com/article/bad08e1ec2e4c709c9512161.html


这个网站可以设置字体格式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 17:30:24 | 显示全部楼层
大地0725 发表于 2018-5-28 16:40
请问发python代码,怎么设置格式?

代码格式设置.png


提问问题界面的输入框上面有<>这样的符号,点击这个,然后弹出输入框,里面黏贴代码就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 18:50:37 | 显示全部楼层
  1. import math

  2. class Point1:
  3.     def __init__(self, x1, y1):
  4.         self.x1 = x1
  5.         self.y1=y1
  6.         
  7. p1=Point1(2,2)     

  8. class Point2:
  9.     def __init__(self, x2, y2):
  10.         self.x2 = x2
  11.         self.y2 = y2

  12. p2=Point2(4,4)

  13. class Line():

  14.     def __init__(self,p1,p2):
  15.          super().__init__()
  16.         
  17.     def get_len(self):
  18.         square = (p2.x2 - p1.x1)*(p2.x2 - p1.x1) + (p2.y2 - p1.y1)*(p2.y2 - p1.y1)
  19.         print(p1.x1,p1.y1,p2.x2,p2.y2)
  20.         self.line = math.sqrt(square)
  21.         print(self.line)


  22. l =Line(p1,p2)
  23. l.get_len()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 18:51:11 | 显示全部楼层
金刚 发表于 2018-5-28 17:30
提问问题界面的输入框上面有这样的符号,点击这个,然后弹出输入框,里面黏贴代码就行了

谢谢,成功了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 06:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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