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) 据我所知,initreprstr是python方法,它们通过在类中修改对象而不显式调用。因此,reprstr都在这两个类中的原因是,当在解释器中输入f时,能够获得输出“点(0,0),点()。但当我尝试时,我得到的数字没有属性“x”

a) 当使用单个点直接进入类点时,我设法创建了x和y值,但在通过类图进行操作时,我似乎无法创建x和y值,即使我通过使用初始化类图中的左下角和右上角

点。init(左下)

换句话说,我不知道如何将图(点(),点(1,2))分解为:

点()=x=0,y=0

点(1,2)=x=1,y=2

通过使用第一类

2) 我不知道如何在不使用继承的情况下“重写Python函数”,这可能吗?这里我指的是我在这里使用的方法:initreprstr

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) 您使用的是地物对象,而不是地物reprstr方法中的点对象“Figure”没有“x”和“y”属性,只有“bottom_left”和“top_right”(两个对象均为Point类型)。因此,请参考这些

1a)如上所述:无需重新初始化点对象。您只需将“bottom_left”设置为输入的“bottom_left”对象,将“top_right”设置为相同的对象(您正在执行此操作)

2) 通过在“Figure”中创建自己的reprstr方法,您将覆盖默认的“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)