为什么更改 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
答案 0 :(得分:0)
调用print(something)
时,将使用__str__
is called的something
方法:
所有非关键字参数都像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__())