Python 使用其他类的实例,从一个类到另一个类的点(x,y)重写和分离x和y的值 首先,感谢您花时间考虑下面的询盘。英语不是我的主要语言,所以我尽量说清楚,所以我提前为此道歉。
考虑这些问题的代码(请记住,我不能更改课堂上的任何代码): 分配时Python 使用其他类的实例,从一个类到另一个类的点(x,y)重写和分离x和y的值 首先,感谢您花时间考虑下面的询盘。英语不是我的主要语言,所以我尽量说清楚,所以我提前为此道歉。,python,class,oop,inheritance,Python,Class,Oop,Inheritance,考虑这些问题的代码(请记住,我不能更改课堂上的任何代码): 分配时 f = Figure(Point(),Point(1,2)) 1) 据我所知,init、repr和str是python方法,它们通过在类中修改对象而不显式调用。因此,repr和str都在这两个类中的原因是,当在解释器中输入f时,能够获得输出“点(0,0),点()。但当我尝试时,我得到的数字没有属性“x” a) 当使用单个点直接进入类点时,我设法创建了x和y值,但在通过类图进行操作时,我似乎无法创建x和y值,即使我通过使用初始化
f = Figure(Point(),Point(1,2))
1) 据我所知,init、repr和str是python方法,它们通过在类中修改对象而不显式调用。因此,repr和str都在这两个类中的原因是,当在解释器中输入f时,能够获得输出“点(0,0),点()。但当我尝试时,我得到的数字没有属性“x”
a) 当使用单个点直接进入类点时,我设法创建了x和y值,但在通过类图进行操作时,我似乎无法创建x和y值,即使我通过使用初始化类图中的左下角和右上角
点。init(左下)
换句话说,我不知道如何将图(点(),点(1,2))分解为:
点()=x=0,y=0
点(1,2)=x=1,y=2
通过使用第一类
2) 我不知道如何在不使用继承的情况下“重写Python函数”,这可能吗?这里我指的是我在这里使用的方法:init、repr和str
3) 当尝试从类点通过
print(Point().setx(self.bottom_left))
我得到的值为零。当我在setx()中放置一个返回值(只是为了测试,因为我不能这样做)时,它返回点(0,0),而不仅仅是x值
我的猜测是我必须使用继承,但有人建议我只从类的角度使用实例
在上一篇文章之后,我通常不会经常问这个问题,但现在我的时间不多了,我真的很想了解问题的核心(对于我来说,这是一个更简化的实际作业版本,可以消除我的核心误解,即通常将一个类中的值、对象和实例关联到另一个类中。在重新初始化Figure类的init方法中的点时,您的第一个问题出现了:
Point.__init__(bottom_left)
Point.__init__(top_right)
如果您检查'Point'类的init方法,它会接受参数'self,xcoord=0,ycoord=0'。因此您要做的是将'bottom_left'和'top_right'点作为'self'参数发送,其中x坐标和y坐标的默认值。这会将这些点的值设置为0
无需调用这些初始化;调用Point()和Point(1,2)时,您已经初始化了点
为解决您的担忧:
1) 您使用的是地物对象,而不是地物repr和str方法中的点对象“Figure”没有“x”和“y”属性,只有“bottom_left”和“top_right”(两个对象均为Point类型)。因此,请参考这些
1a)如上所述:无需重新初始化点对象。您只需将“bottom_left”设置为输入的“bottom_left”对象,将“top_right”设置为相同的对象(您正在执行此操作)
2) 通过在“Figure”中创建自己的repr和str方法,您将覆盖默认的“object”类方法,而不是“Point”方法。您可以利用off Point的实现,而不是重复所有内容。例如:
def __str__(self):
return str(self.bottom_left) + ', ' + str(self.top_right)
3) 检查setx()的方法参数。它期望什么?提示:不是点对象 首先,代码中有一些语法错误:
def __init__(self, xcoord=0, ycoord=0)
末尾缺少一个:
return 'Point('+str(self.x)+','+str(self.y)+') + ', Point('+str(self.x)+','+str(self.y)+')'
return 'Point('+str(self.x)+','+str(self.y)+') + ', Point('+str(self.x)+','+str(self.y)+')'
有缺失或额外的“
1) 是的,这些方法改变了类实例的创建和表示方式<代码>\uuuu str\uuuuu和\uuuu repr\uuuu
失败,因为调用它们时(当您尝试打印该实例时),这两种方法下的代码失败。看起来您想要返回点坐标的值,更像这样:
def __repr__(self):
return 'Point(' + str(self.bottom_left.x) + ',' + str(self.bottom_left.y) + '), ' + 'Point(' + str(self.top_right.x) + ',' + str(self.top_right.y) + ')'
def __str__(self):
return 'Point(' + str(self.bottom_left.x) + ',' + str(self.bottom_left.y) + '), ' + 'Point(' + str(self.top_right.x) + ',' + str(self.top_right.y) + ')'
a) 您不需要在图中显式调用点;当您传递它时,这种情况已经发生了Point()
2) 不太确定您在这里的意思,不确定在不重写这些方法的情况下,您将如何做
3) 在调用setx
后,这里不打印Point()
;您正在打印setx
的返回None
是从任何不显式返回内容的Python函数返回的内容。您的setx
函数没有return
,因此它返回None
。它仍然有效,因为它仍然设置了x。尝试:
p = Point()
p.setx(44)
print(p)
非常感谢你。我还需要一段时间才能完全理解你的解释,但对我来说已经很清楚了。非常感谢!这两种解释都有助于我比以前更好地理解,但我会反复阅读以充分消化它们。
p = Point()
p.setx(44)
print(p)