面向对象编程基础(python)

2024-09-30 18:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

等级:初级

在下面的代码中,我的“samePoint”函数返回False,而我期望的是True。有什么提示吗?在

import math

class cPoint:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.radius = math.sqrt(self.x*self.x + self.y*self.y)
        self.angle = math.atan2(self.y,self.x)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)

class pPoint:
    def __init__(self,r,a):
        self.radius = r
        self.angle = a
        self.x = r * math.cos(a)
        self.y = r * math.sin(a)
    def cartesian(self):
        return (self.x, self.y)
    def polar(self):
        return (self.radius, self.angle)

def samePoint(p, q):
    return (p.cartesian == q.cartesian)

>>> p = cPoint(1.0000000000000002, 2.0)
>>> q = pPoint(2.23606797749979, 1.1071487177940904)
>>> p.cartesian()
(1.0000000000000002, 2.0)
>>> q.cartesian()
(1.0000000000000002, 2.0)
>>> samePoint(p, q)
False
>>> 

资料来源:麻省理工学院开放式课件http://ocw.mit.edu计算机科学与编程导论2008秋季


Tags: 代码selffalsereturninitdefmathclass
3条回答

看看你的代码

def samePoint(p, q):
    return (p.cartesian == q.cartesian)

笛卡尔,笛卡尔都是函数,你比较的是函数,而不是函数结果。由于比较两个不同的函数,结果是错误的

你应该编码的是

^{pr2}$

您没有调用相等检查上的方法。所以你把这些方法和其他方法做了比较。在

尝试:

 return (p.cartesian() == q.cartesian())

在您修复了函数调用问题之后,您将遇到浮点问题。在

试试看

def is_same_point(p1, p2, e):
    for c1, c2 in zip(c1, c2):
       if abs(c1 - c2) > e:
          return False
    return True

我真的很惊讶,你发布的代码样本对你有用。你一定是为这样做而建造的。一般来说,不能直接比较浮点值。在

编写上述函数的一种更具python风格的方法是

^{pr2}$

你仍然需要传递e(对于epsilon),这会很快变老的。在

def make_point_tester(e):
    def is_same_point(point1, point2):
        return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2))
    return is_same_point

is_same_point = make_point_tester(.001)

您已经准备好将函数作为第一类对象,因此您应该不会对这段代码有任何问题;)

相关问题 更多 >