основы объектно-ориентированного программирования (python) - PullRequest
2 голосов
/ 26 сентября 2010

Уровень: Начинающий

В следующем коде моя функция 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
>>> 

источник: MIT OpenCourseWare http://ocw.mit.edu Введение в информатику и программирование Осень 2008

Ответы [ 3 ]

6 голосов
/ 26 сентября 2010

Глядя на ваш код

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

p.cartesian, q.cartesian являются функциями, и вы сравниваете функцию, а не результат функции. Так как сравнение двух разных функций, результат False

То, что вы должны были кодировать, это

def samePoint(p, q):
    return (p.cartesian() == q.cartesian())
3 голосов
/ 26 сентября 2010

Вы не вызываете методы на равной проверке. Итак, вы сравниваете методы с каждым другим.

Попытка:

 return (p.cartesian() == q.cartesian())
1 голос
/ 26 сентября 2010

После того, как вы исправите вызов функции, у вас возникнут проблемы с плавающей запятой.

try,

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

Я действительно удивлен, что это работает для вас спример кода вы разместили.Вы, должно быть, построили это, чтобы сделать это.Как правило, вы не можете напрямую сравнивать значения с плавающей запятой на равенство.

Более питонический способ написания вышеуказанной функции -

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)

Вы уже столкнулись с функциями, являющимися объектами первого класса, поэтому у вас не должно быть никаких проблем с этим кодом;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...