Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在print函数中使用类名_Python - Fatal编程技术网

Python 在print函数中使用类名

Python 在print函数中使用类名,python,Python,这里是新来的Pythonista 我有点问题。我想打印一个特定的输出,它需要像点x=1,y=2,z=3,xyz的值当然可以不同 代码如下: 课程点: 定义初始自我,x,y,z: self.x=x self.y=y self.z=z 定义自身: 返回fPointx={self.x},y={self.y},z={self.z} 这是测试代码: 导入单元测试 从点导入点 类PointTestsunittest.TestCase: 测试点。 def测试_属性自身: 点=点1、2、3 self.asser

这里是新来的Pythonista

我有点问题。我想打印一个特定的输出,它需要像点x=1,y=2,z=3,xyz的值当然可以不同

代码如下:

课程点: 定义初始自我,x,y,z: self.x=x self.y=y self.z=z 定义自身: 返回fPointx={self.x},y={self.y},z={self.z} 这是测试代码:

导入单元测试 从点导入点 类PointTestsunittest.TestCase: 测试点。 def测试_属性自身: 点=点1、2、3 self.assertEqualpoint.x,point.y,point.z,1,2,3 点x=4 self.assertEqualpoint.x,4 def测试字符串表示自身: 点=点1、2、3 self.asserteQualstPoint,'Pointx=1,y=2,z=3' self.assertEqualreprpoint,'Pointx=1,y=2,z=3' 点y=4 self.asserteQualstPoint,'Pointx=1,y=4,z=3' self.assertEqualreprpoint,'Pointx=1,y=4,z=3' def test_equality_和_equality self: p1=点1、2、3 p2=点1、2、4 p3=点1、2、3 self.assertNotEqualPoint1,2,3,Point1,2,4 self.assertEqualPoint1,2,3,Point1,2,3 self.assertFalsePoint1,2,3!=第1、2、3点 self.assertNotEqualp1,p2 self.assertEqualp1,p3 p3.x,p3.z=p3.z,p3.x self.assertNotEqualp1,p3 self.assertTruep1!=p3 self.assertFalsep1==p3 我遇到的问题是,在str函数中,当我使用打印格式的点时,会抛出断言错误:

AssertionError:'point.point对象位于0x7fbd8850b190'!='点X=1,y=2,z=3'

但当我使用其他任何东西时,它会被打印出来。例如,假设我使用点而不是点:

'点sx=1,y=2,z=3'!='点X=1,y=2,z=3'


为什么会发生这种情况?我如何避免这种情况?

在我使用python 3时,您有两个失败的测试

======================================================================
FAIL: test_equality_and_inequality (test_point.PointTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/josef/tmp/deleteme/test_point.py", line 29, in test_equality_and_inequality
    self.assertEqual(Point(1, 2, 3), Point(1, 2, 3))
AssertionError: <point.Point object at 0x7f7a20cff050> != <point.Point object at 0x7f7a20cff090>
Python类可以有一个_ustr_uuuu方法和一个_repr_uu方法。前者主要用于返回对象的字符串表示形式,因此,如果您将其显示给人,则会得到一些好看的东西。后者我看较少使用,我仍然通常对其进行定义,但据我所知,它应该能够实现对象到表示对象的往返;以这样一种方式显示实例:理论上,您只需计算该字符串表示并忠实地再现对象

您的类定义没有一个_urepr__;,所以测试当然会失败。有时对于较大的值,有时如果我懒惰,我会这样做:

定义自身: 返回自我报告__ 错误发生在

self.assertEqual(repr(point), 'Point(x=1, y=2, z=3)')
由于您只在_点_上自定义了_str uu方法,_repr u仍然是内置方法,因此在0x7fbd8850b190处生成类似点.Point对象的内容。要解决此问题,请定义点的_repr__

当您定义_repr__方法时,python将其用作_str__的默认值,但它不会反过来做

对于不太简单的代码示例,这仍然会导致错误

self.assertEqual(Point(1, 2, 3), Point(1, 2, 3))
这是因为这条线不测试表示是否相等,而是测试对象是否相等。由于两次实例化Point,assertEqual的第一个参数实际上与第二个参数不同,即使它们都是Point的实例,并且它们的实例变量相等

您可以将这些对象理解为双胞胎或克隆:即使它们的所有属性都相同,它们仍然具有不同的标识

如果我们想把双胞胎看作相等,Python允许我们定义Python使用的相等关系来检查对象的相等性。我们可以通过实现_ueq _u方法来定义这一点。最可能的情况是,您想要的是:

class Point:
    def  __init__(x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y}, z={self.z})"

    def __eq__(self, other):
        return self.__repr__() == other.__repr__()

阅读Python神奇方法的介绍可能是个好主意,例如

这不是一种方法,而是一种方法。您应该实现uuu repr_uuuuu,str将依赖它而不需要实现它。它修复了奇怪的0xXXXXXXXX部分,但现在我得到了断言错误:Pointx=1,y=2,z=3!=点X=1,y=2,z=3。据我所知,它们是一样的,这是因为我认为它仍然在比较实例与实例,而不是文本表示与文本表示它设法修复了0x7fbd8850b190部件,但现在运行时,我得到了:断言错误:Pointx=1,y=2,z=3!=点X=1,y=2,z=3。这有什么意义?如果我从你的评论中理解的话,我用repr替换str。这是traceback:traceback最近一次调用last:File,第29行,在test_equality_和_equality AssertionError:Pointx=1,y=2,z=3!=Pointx=1,y=2,z=3感谢您的反馈和帮助!成功了:D
class Point:
    def  __init__(x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y}, z={self.z})"

    def __eq__(self, other):
        return self.__repr__() == other.__repr__()