鱼C论坛

 找回密码
 立即注册
查看: 1726|回复: 10

[已解决]类和对象小程序的问题

[复制链接]
发表于 2017-7-13 21:38:36 | 显示全部楼层 |阅读模式

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

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

x
import random as r
import math

class Point():
    def a(self):
        self.point_a_x=random.randint(0,10)
        self.point_a_y=random.randint(0,10)

    def b(self):
        self.point_b_x=random.randint(0,10)
        self.point_b_y=random.randint(0,10)



class GetLen(Point):
    def Get(self):
        self.z=math.sqrt((self.point_a_x-self.point_b_x)**2+(self.point_a_y-self.point_b_y)**2)
        
    def re_z(self):
        return self.z
  

请问大佬们,这行代码有什么问题,我是按照自己的想法打出来的,是实现在坐标轴里面X和Y的直线距离,然后错误一直都是
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    b.re_z()
  File "C:/Users/Administrator/Desktop/2.py", line 20, in re_z
    return self.z
AttributeError: 'GetLen' object has no attribute 'z'

求解答,如果可以的话大佬们应该可以从我的代码中发现我有什么不足的地方,望指教!!!
最佳答案
2017-7-14 11:26:54
qq13459621230 发表于 2017-7-14 10:51
那这样子的话,就是说SELF参数就是只能在本类里面进行传递了?有办法让这两个类参数互相传递吗?
  1. import random  #你的这个地方有问题,改成这样,不然后续无法使用
  2. import math

  3. class Point():
  4.     #这里是调用2个函数,目的是产生类的基本属性,方便继承类的调用
  5.     def  __init__(self):
  6.       self.a()
  7.       self.b()
  8.     def a(self):
  9.         self.point_a_x=random.randint(0,10)
  10.         self.point_a_y=random.randint(0,10)

  11.     def b(self):
  12.         self.point_b_x=random.randint(0,10)
  13.         self.point_b_y=random.randint(0,10)



  14. class GetLen(Point):
  15.     def Get(self):
  16.         self.z=math.sqrt((self.point_a_x-self.point_b_x)**2+(self.point_a_y-self.point_b_y)**2)
  17.         
  18.     def re_z(self):
  19.         return self.z
  20.         
  21. c = GetLen()
  22. c.Get()  #先必须调用这个函数,不然z是不存在的
  23. test = c.re_z()
  24. print(test)
复制代码


类是可以向下继承的,那你的这个例子就是继承类,参数已经传递到子类了
至于你说的 互相传递,难道你要把子类的参数传递到父类?这个做法并不是不能,只是,你可能需要好好看看类的继承方面的知识点

上面是我在你的代码基础上改的的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-13 22:02:19 | 显示全部楼层
昨天刚回答这个问题,所以照搬过来给你参考下:

  1. import math as m
  2. import random as r

  3. class Point:
  4.     def __init__(self):
  5.         self.x = r.randint(0, 100)
  6.         self.y = r.randint(0, 100)
  7.         print('该点的x坐标为:%d\n该点的y坐标为:%d' % (self.x, self.y))
  8.     def self_x(self):
  9.         return self.x
  10.    
  11.     def self_y(self):
  12.         return self.y

  13. class Line:
  14.     def __init__(self):
  15.         PointA = Point()
  16.         PointB = Point()
  17.         self.line_x = PointA.self_x() - PointB.self_x()
  18.         self.line_y = PointA.self_y() - PointB.self_y()
  19.         self.length = m.sqrt(self.line_x *self.line_x  + self.line_y*self.line_y)

  20.     def getLength(self):
  21.         return self.length
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 09:32:00 | 显示全部楼层
类的默认参数要放在__init__里面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 09:40:36 | 显示全部楼层
1、random已经命名给r,就不需要再使用random
2、Point和GetLen之间缺乏联系,且GetLen也无法传入Point对象,使得程序无法运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 10:49:34 | 显示全部楼层
小甲鱼 发表于 2017-7-13 22:02
昨天刚回答这个问题,所以照搬过来给你参考下:

好,我好好的看看,谢谢,不过我有个问题想顺便问问,就是元祖,列表,字典能设置参数上限吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 10:50:00 | 显示全部楼层
gopythoner 发表于 2017-7-14 09:32
类的默认参数要放在__init__里面

嗯嗯,好 我好好注意一下,谢谢拉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 10:51:40 | 显示全部楼层
ooxx7788 发表于 2017-7-14 09:40
1、random已经命名给r,就不需要再使用random
2、Point和GetLen之间缺乏联系,且GetLen也无法传入Point对 ...

那这样子的话,就是说SELF参数就是只能在本类里面进行传递了?有办法让这两个类参数互相传递吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 11:10:54 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-7-14 11:15 编辑
qq13459621230 发表于 2017-7-14 10:51
那这样子的话,就是说SELF参数就是只能在本类里面进行传递了?有办法让这两个类参数互相传递吗?


可以直接把实例对象做为参数传进令一个类里面咯

  1. In [13]:
  2.     ...: class Point:
  3.     ...:     def __init__(self):
  4.     ...:         self.x = r.randint(0, 100)
  5.     ...:         self.y = r.randint(0, 100)
  6.     ...:         print('该点的x坐标为:%d\n该点的y坐标为:%d' % (self.x, self
  7.     ...: ))
  8.     ...:     def self_x(self):
  9.     ...:         return self.x
  10.     ...:
  11.     ...:     def self_y(self):
  12.     ...:         return self.y
  13.     ...:
  14.     ...: class Line:
  15.     ...:     def __init__(self,p1,p2):
  16.     ...:         PointA = p1
  17.     ...:         PointB = p2
  18.     ...:         self.line_x = PointA.self_x() - PointB.self_x()
  19.     ...:         self.line_y = PointA.self_y() - PointB.self_y()
  20.     ...:         self.length = m.sqrt(self.line_x *self.line_x  + self.line_y
  21.     ...: elf.line_y)
  22.     ...:
  23.     ...:     def getLength(self):
  24.     ...:         return self.length
  25.     ...:

  26. In [14]: Pa = Point()
  27. 该点的x坐标为:47
  28. 该点的y坐标为:84

  29. In [15]: Pb= Point()
  30. 该点的x坐标为:91
  31. 该点的y坐标为:23

  32. In [16]: L = Line(Pa,Pb)

  33. In [18]: L.getLength()
  34. Out[18]: 75.21303078589507
复制代码


把小甲鱼的代码稍微修改一下,小甲鱼的代码是直接在类里面直接生成实例对象。
我在这里修改成传入两个实例对象,其他不做修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 11:26:54 | 显示全部楼层    本楼为最佳答案   
qq13459621230 发表于 2017-7-14 10:51
那这样子的话,就是说SELF参数就是只能在本类里面进行传递了?有办法让这两个类参数互相传递吗?
  1. import random  #你的这个地方有问题,改成这样,不然后续无法使用
  2. import math

  3. class Point():
  4.     #这里是调用2个函数,目的是产生类的基本属性,方便继承类的调用
  5.     def  __init__(self):
  6.       self.a()
  7.       self.b()
  8.     def a(self):
  9.         self.point_a_x=random.randint(0,10)
  10.         self.point_a_y=random.randint(0,10)

  11.     def b(self):
  12.         self.point_b_x=random.randint(0,10)
  13.         self.point_b_y=random.randint(0,10)



  14. class GetLen(Point):
  15.     def Get(self):
  16.         self.z=math.sqrt((self.point_a_x-self.point_b_x)**2+(self.point_a_y-self.point_b_y)**2)
  17.         
  18.     def re_z(self):
  19.         return self.z
  20.         
  21. c = GetLen()
  22. c.Get()  #先必须调用这个函数,不然z是不存在的
  23. test = c.re_z()
  24. print(test)
复制代码


类是可以向下继承的,那你的这个例子就是继承类,参数已经传递到子类了
至于你说的 互相传递,难道你要把子类的参数传递到父类?这个做法并不是不能,只是,你可能需要好好看看类的继承方面的知识点

上面是我在你的代码基础上改的的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-15 11:04:18 | 显示全部楼层
gopythoner 发表于 2017-7-14 11:26
类是可以向下继承的,那你的这个例子就是继承类,参数已经传递到子类了
至于你说的 互相传递,难道 ...

好谢谢提出的意见!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-15 11:05:28 | 显示全部楼层
ooxx7788 发表于 2017-7-14 11:10
可以直接把实例对象做为参数传进令一个类里面咯

好,真是麻烦您了,我会好好看看的!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 05:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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