鱼C论坛

 找回密码
 立即注册
查看: 4014|回复: 18

[已解决]类的继承关系,有人帮忙吗?

[复制链接]
发表于 2022-12-17 21:54:03 | 显示全部楼层 |阅读模式

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

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

x
import math

class Point:
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
    def getX(self):
        return self.x
    def getY(self):
        return self.y

class Line:
    def __init__(self,p1,p2):
        self.x=p1.getX()-p2.getX()
        self.y=p1.getY()-p2.getY()
        self.len=math.sqrt(self.x*self.x+self.y*self.y)
    def getLen(self):
        return self.len

p1=Point(1,1)
p2=Point(4,5)
line=Line(p1,p2)
print(line.getLen())

这样也可以吗?Line类中并没有getX()和getY()的方法啊?也可以引用吗?没有继承关系啊?什么原理?有没有大佬给我解释解释?
最佳答案
2022-12-17 22:00:41
本帖最后由 lxping 于 2022-12-17 22:14 编辑

Line类中调用getX()和getY()的是p1,p2,这两个参数是你传进来的Point类的实例化对象,p1,p2是有这两个方法的,所以是没有问题的
如果你p1、p2不是Point类的实例化对象,而是p1=(1,1) ,p2=(4,5),那就会报错

代码请不要直接发出来,用代码格式

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

使用道具 举报

发表于 2022-12-17 22:00:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 lxping 于 2022-12-17 22:14 编辑

Line类中调用getX()和getY()的是p1,p2,这两个参数是你传进来的Point类的实例化对象,p1,p2是有这两个方法的,所以是没有问题的
如果你p1、p2不是Point类的实例化对象,而是p1=(1,1) ,p2=(4,5),那就会报错

代码请不要直接发出来,用代码格式

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

使用道具 举报

发表于 2022-12-18 08:16:38 | 显示全部楼层
调用的又不是self的getX、getY方法,而是p1、p2的getX和getY,只要传入的p1和p2有这个方法就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-18 10:12:24 | 显示全部楼层
这个不是类的继承,应该算是多态吧

这个和普通函数是一样的,Line里面的构造函数中的传入的参数是Point实例化出来的对象,对象里面有getX和getY方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-18 13:24:23 | 显示全部楼层
ZhKQYu 发表于 2022-12-18 10:12
这个不是类的继承,应该算是多态吧

这个和普通函数是一样的,Line里面的构造函数中的传入的参数是Point ...

这跟多态没有半毛钱关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-18 15:35:19 | 显示全部楼层
isdkz 发表于 2022-12-18 13:24
这跟多态没有半毛钱关系

这不是多态是啥,如果另一个别的类里面也定义了这两个方法,也能用这个构造函数啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 17:03:49 | 显示全部楼层
本帖最后由 patrickcui 于 2022-12-19 17:27 编辑
lxping 发表于 2022-12-17 22:00
Line类中调用getX()和getY()的是p1,p2,这两个参数是你传进来的Point类的实例化对象,p1,p2是有这两个方法 ...

class Line:
    def __init__(self,p1,p2):
        self.x=p1.getX()-p2.getX()
        self.y=p1.getY()-p2.getY()
我说的是在定义的时候,p1和p2是实例化了point类的,但是我看不出来是在哪一步被实例化了。实例化后可以调用我是知道的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 17:12:35 | 显示全部楼层
patrickcui 发表于 2022-12-19 17:03
我说的是在定义的时候,Line并没有getX和getY这两个方法啊!实例化后可以调用我是知道的

Line类是没有getX和getY这两个方法。
构造函数中调用getX和getY这两个方法的对象也不是Line的对象
定义类的时候并不会去实现这两句代码
self.x=p1.getX()-p2.getX()
self.y=p1.getY()-p2.getY()
只有在实例化Line类对象的时候才会去调用以上语句。
就像你定义一个函数,你不去执行他函数还是存在的,但是语句并没有运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 17:17:23 | 显示全部楼层
lxping 发表于 2022-12-19 17:12
Line类是没有getX和getY这两个方法。
构造函数中调用getX和getY这两个方法的对象也不是Line的对象
定义 ...

在定义Line类的时候__init()__传进了p1和p2两个参数,这两个参数的类型为对象,但是我不知道怎么体现出来的
也没有任何语句体现出来p1和p2是两个对象还是实例化的point类的对象!这么说你能明白吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 17:26:59 | 显示全部楼层
patrickcui 发表于 2022-12-19 17:17
在定义Line类的时候__init()__传进了p1和p2两个参数,这两个参数的类型为对象,但是我不知道怎么体现出来 ...

这个就要看写程序的人是怎么构思的了,写程序的人是知道需要传入point类实例化的对象,这里最好是加上注释,说明p1和p2是point类实例化的对象。
class Line:
    #p1,p2为Point类的实例化对象
    def __init__(self,p1,p2):
        self.x=p1.getX()-p2.getX()
        self.y=p1.getY()-p2.getY()
不然就像前面说的如果p1=(1,1) ,p2=(4,5)这样赋值,那就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 17:34:40 | 显示全部楼层
lxping 发表于 2022-12-19 17:26
这个就要看写程序的人是怎么构思的了,写程序的人是知道需要传入point类实例化的对象,这里最好是加上注 ...

我是真的没看出来p1和p2是在什么时候被实例化了的,这让我有点蒙!如果说就在传入p1和p2参数的时候同时被实例化的话,那我要怎么区分p1和p2什么时候是对象?什么时候是函数?什么时候又是字符串?等等等等呢?难道是要看下面的代码是否有point类中的方法被p1和p2调用了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 17:43:58 | 显示全部楼层
patrickcui 发表于 2022-12-19 17:34
我是真的没看出来p1和p2是在什么时候被实例化了的,这让我有点蒙!如果说就在传入p1和p2参数的时候同时被 ...


类Line里面的p1,p2是形参,类定义的时候还不存在,形参可以随便改个名字,例如
class Line:
    def __init__(self,a,b):
        #a,b为Point类的实例化对象
        self.x=a.getX()-b.getX()
        self.y=a.getY()-b.getY()
        self.len=math.sqrt(self.x*self.x+self.y*self.y)
    def getLen(self):
        return self.len
定义类就跟定义函数一样,你不调用是不会执行的,你在调用函数的时候需要传入实参也就是下面的语句
p1=Point(1,1)
p2=Point(4,5)
line=Line(p1,p2)
这个时候p1和p2不就实例化出来了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 17:47:05 | 显示全部楼层
lxping 发表于 2022-12-19 17:43
类Line里面的p1,p2是形参,类定义的时候还不存在,形参可以随便改个名字,例如

定义类就跟定义函数 ...

在没有任何继承和组合的情况下,一个类的形参可以调用另一个类的方法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 17:51:56 | 显示全部楼层
本帖最后由 lxping 于 2022-12-19 17:57 编辑
patrickcui 发表于 2022-12-19 17:47
在没有任何继承和组合的情况下,一个类的形参可以调用另一个类的方法吗?


不是“一个类的形参可以调用另一个类的方法”,也只能说是在类定义的时候,其形参调用了形参自身的方法。如果传入的实参没有这个方法,调用类实例化对象的时候就会报错,如果传入的实参有这个方法,就可以顺利执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 17:58:45 | 显示全部楼层
lxping 发表于 2022-12-19 17:51
不是“一个类的形参可以调用另一个类的方法”,也只能说是在类定义的时候,其形参调用了形参自身的方法 ...

按照这个逻辑的话,那p1和p2作为形参同时也作为point的实例化对象才有资格调用自身的方法,不是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 18:45:24 | 显示全部楼层
patrickcui 发表于 2022-12-19 17:58
按照这个逻辑的话,那p1和p2作为形参同时也作为point的实例化对象才有资格调用自身的方法,不是吗?
def myfunc(a):
    return a.casefold()
这个函数有没有问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 19:00:43 | 显示全部楼层
lxping 发表于 2022-12-19 18:45
这个函数有没有问题?

为什么没有出错???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-19 19:10:46 | 显示全部楼层
本帖最后由 lxping 于 2022-12-19 19:13 编辑
patrickcui 发表于 2022-12-19 19:00
为什么没有出错???


建议好好看看小甲鱼函数篇章的知识,理解什么是形参先
https://fishc.com.cn/forum.php?mod=viewthread&tid=206415&extra=page%3D2%26filter%3Dtypeid%26typeid%3D769
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-19 19:30:46 | 显示全部楼层
lxping 发表于 2022-12-19 19:10
建议好好看看小甲鱼函数篇章的知识,理解什么是形参先
https://fishc.com.cn/forum.php?mod=viewthrea ...

这也没说你的范例啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 07:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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