在方法内部更改一行会导致我不了解的后果

时间:2019-07-02 17:00:53

标签: python class methods

为什么更改 str 方法会影响其他方法?似乎更改__str__方法也会更改返回Point2d对象的其他方法。

import math

class Point2d(object):
    def __init__( self, x0, y0 ):
        self.x = x0
        self.y = y0   

    def magnitude(self):
        return math.sqrt(self.x**2 + self.y**2)

    # 2.1
    def __str__(self):
        #return str((self.x, self.y))
        return 'self.x, self.y'

    # 2.2
    def __sub__(self, other):
        return Point2d(self.x - other.x, self.y - other.y)


    # 2.4
    def __eq__(self, other):
        if self.x == other.x and self.y == other.y:
            return True

p = Point2d(0,4)
q = Point2d(5,10)
r = Point2d(0,4)
leng = Point2d.magnitude(q)
print("Magnitude {:.2f}".format( leng ))
print(p.__str__(), type(p.__str__())) # 2.1  
print(p-q) # 2.2
print(Point2d.__sub__(p,q))  # 2.2 same as line above (line 60).
print(p.__eq__(r))

预期结果:

Magnitude 11.18
self.x, self.y <class 'str'>
(-5, -6)
(-5, -6)
True

实际结果:

Magnitude 11.18
self.x, self.y <class 'str'>
self.x, self.y
self.x, self.y
True

2 个答案:

答案 0 :(得分:0)

调用print(something)时,将使用__str__ is calledsomething方法:

  

所有非关键字参数都像str()一样转换为字符串,并写入流中,以sep分隔,然后以end分隔。 sep和end都必须是字符串;它们也可以是None,这意味着要使用默认值。如果未提供任何对象,则print()只会写完。

因此,所做的更改实际上并不会影响所有其他功能,它们会影响其打印方式。如果要在Jupyter笔记本中启动代码并删除print字,则会看到Point2d对象。

答案 1 :(得分:0)

__str__()是一种“特殊”方法。您会注意到

print(p.__str__())

print(p)

给您相同的结果。

由于__sub__()(以及所有类似的函数)返回其结果,

print(p-q) # 2.2

相同
z = p - q
print(z)
我们说过的

相同
print(z.__str__())