类的继承关系,有人帮忙吗?
import mathclass 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()的方法啊?也可以引用吗?没有继承关系啊?什么原理?有没有大佬给我解释解释? 本帖最后由 lxping 于 2022-12-17 22:14 编辑
Line类中调用getX()和getY()的是p1,p2,这两个参数是你传进来的Point类的实例化对象,p1,p2是有这两个方法的,所以是没有问题的
如果你p1、p2不是Point类的实例化对象,而是p1=(1,1) ,p2=(4,5),那就会报错
代码请不要直接发出来,用代码格式
调用的又不是self的getX、getY方法,而是p1、p2的getX和getY,只要传入的p1和p2有这个方法就可以了 这个不是类的继承,应该算是多态吧
这个和普通函数是一样的,Line里面的构造函数中的传入的参数是Point实例化出来的对象,对象里面有getX和getY方法 ZhKQYu 发表于 2022-12-18 10:12
这个不是类的继承,应该算是多态吧
这个和普通函数是一样的,Line里面的构造函数中的传入的参数是Point ...
这跟多态没有半毛钱关系 isdkz 发表于 2022-12-18 13:24
这跟多态没有半毛钱关系
这不是多态是啥,如果另一个别的类里面也定义了这两个方法,也能用这个构造函数啊 本帖最后由 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类的,但是我看不出来是在哪一步被实例化了。实例化后可以调用我是知道的 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类对象的时候才会去调用以上语句。
就像你定义一个函数,你不去执行他函数还是存在的,但是语句并没有运行。 lxping 发表于 2022-12-19 17:12
Line类是没有getX和getY这两个方法。
构造函数中调用getX和getY这两个方法的对象也不是Line的对象
定义 ...
在定义Line类的时候__init()__传进了p1和p2两个参数,这两个参数的类型为对象,但是我不知道怎么体现出来的
也没有任何语句体现出来p1和p2是两个对象还是实例化的point类的对象!这么说你能明白吗? 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)这样赋值,那就会报错
lxping 发表于 2022-12-19 17:26
这个就要看写程序的人是怎么构思的了,写程序的人是知道需要传入point类实例化的对象,这里最好是加上注 ...
我是真的没看出来p1和p2是在什么时候被实例化了的,这让我有点蒙!如果说就在传入p1和p2参数的时候同时被实例化的话,那我要怎么区分p1和p2什么时候是对象?什么时候是函数?什么时候又是字符串?等等等等呢?难道是要看下面的代码是否有point类中的方法被p1和p2调用了吗? 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不就实例化出来了吗? lxping 发表于 2022-12-19 17:43
类Line里面的p1,p2是形参,类定义的时候还不存在,形参可以随便改个名字,例如
定义类就跟定义函数 ...
在没有任何继承和组合的情况下,一个类的形参可以调用另一个类的方法吗? 本帖最后由 lxping 于 2022-12-19 17:57 编辑
patrickcui 发表于 2022-12-19 17:47
在没有任何继承和组合的情况下,一个类的形参可以调用另一个类的方法吗?
不是“一个类的形参可以调用另一个类的方法”,也只能说是在类定义的时候,其形参调用了形参自身的方法。如果传入的实参没有这个方法,调用类实例化对象的时候就会报错,如果传入的实参有这个方法,就可以顺利执行 lxping 发表于 2022-12-19 17:51
不是“一个类的形参可以调用另一个类的方法”,也只能说是在类定义的时候,其形参调用了形参自身的方法 ...
按照这个逻辑的话,那p1和p2作为形参同时也作为point的实例化对象才有资格调用自身的方法,不是吗? patrickcui 发表于 2022-12-19 17:58
按照这个逻辑的话,那p1和p2作为形参同时也作为point的实例化对象才有资格调用自身的方法,不是吗?
def myfunc(a):
return a.casefold()
这个函数有没有问题? lxping 发表于 2022-12-19 18:45
这个函数有没有问题?
为什么没有出错??? 本帖最后由 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 lxping 发表于 2022-12-19 19:10
建议好好看看小甲鱼函数篇章的知识,理解什么是形参先
https://fishc.com.cn/forum.php?mod=viewthrea ...
这也没说你的范例啊?
页:
[1]