首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象编程基础(python)

面向对象编程基础(python)
EN

Stack Overflow用户
提问于 2010-09-26 17:33:07
回答 3查看 502关注 0票数 2

级别:初学者

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

代码语言:javascript
复制
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
>>> 

来源:麻省理工学院OpenCourseWare http://ocw.mit.edu计算机科学与编程入门2008秋季

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-26 17:36:40

查看您的代码

代码语言:javascript
复制
def samePoint(p, q):
    return (p.cartesian == q.cartesian)

p.cartesian、q.cartesian是函数,您比较的是函数而不是函数结果。由于比较了两个不同的函数,因此结果为假

您应该编写的代码是

代码语言:javascript
复制
def samePoint(p, q):
    return (p.cartesian() == q.cartesian())
票数 6
EN

Stack Overflow用户

发布于 2010-09-26 17:35:53

您没有调用相等检查的方法。所以你是在比较每种方法的优劣。

尝试:

代码语言:javascript
复制
 return (p.cartesian() == q.cartesian())
票数 3
EN

Stack Overflow用户

发布于 2010-09-26 17:39:18

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

试一下,

代码语言:javascript
复制
def is_same_point(p1, p2, e):
    for c1, c2 in zip(c1, c2):
       if abs(c1 - c2) > e:
          return False
    return True

我真的很惊讶,用你发布的代码样本,它能为你工作。您必须构造它才能这样做。一般来说,你不能直接比较浮点值是否相等。

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

代码语言:javascript
复制
def is_same_point(point1, point2, e):
    return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2))

不过,您仍然需要传递e (用于epsilon),这很快就会过时。

代码语言:javascript
复制
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)

您已经遇到了作为第一类对象的函数,因此使用此代码应该不会有任何问题。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3797219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档