面向对象编程基础知识(python)

时间:2010-09-26 09:33:07

标签: python oop

等级:初学者

在下面的代码中,我的'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年秋季计算机科学与编程简介

3 个答案:

答案 0 :(得分:6)

查看您的代码

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

p.cartesian,q.cartesian是函数,你比较函数而不是函数结果。由于比较了两个不同的函数,结果为False

你应该编码的是

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

答案 1 :(得分:3)

你没有在平等检查上调用这些方法。所以你要比较各种方法。

尝试:

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

答案 2 :(得分:1)

修复了函数调用之后,你会遇到浮点问题。

试试,

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

我真的很惊讶它正在为您提供您发布的代码示例。你必须构建它才能这样做。通常,您无法直接比较浮点值是否相等。

编写上述函数的更多pythonic方法是

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

你仍然必须传递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)

你已经把所有的函数都作为第一类对象运行了,所以你不应该对这段代码有任何麻烦;)

相关问题