Ошибка получения имени для функции, которую я определил ранее в скрипте

Я строю класс Rectangle, чтобы увидеть, касаются ли два прямоугольника по углам. Это последнее упражнение openbookproject для Python, глава 16. http://openbookproject.net/thinkcs/python/english3e/classes_and_objects_II.html

У меня проблема в том, что я определил функцию same_coordinates, а затем использовал эту функцию для определения метода corner_touching, однако, когда я делаю это, я получаю NameError: имя «same_coordinates» не определено, и я не уверен, почему.

class Rectangle:
"A class to manufacture Rectangle objects"
...
   def same_coordinates(P1,P2):
       return P1.x == P2.x and P1.y == P2.y

   def corner_touching(self,r2):
       r1bl = cao.Point(self.corner.x,self.corner.y)
       r1br = cao.Point(self.corner.x+self.width,self.corner.y)
       r1tr = cao.Point(self.corner.x+self.width,self.corner.y + 
       self.height)
       r1tl = cao.Point(self.corner.x,self.corner.y + self.height)

       r2bl = cao.Point(r2.corner.x,r2.corner.y)
       r2br = cao.Point(r2.corner.x+r2.width,r2.corner.y)
       r2tr = cao.Point(r2.corner.x+r2.width,r2.corner.y + r2.height)
       r2tl = cao.Point(r2.corner.x,r2.corner.y + r2.height)

    return same_coordinates(r1bl,r2tr) or same_coordinates(r1tl,r2br) or 
         same_coordinates(r1tr,r2bl) or same_coordinates(r1br,r2tl)

Я использую «...» для представления init и других методов, которые работают нормально. Ошибка, которую я получаю, когда использую два прямоугольника:

Возникла исключительная ситуация: имя NameError 'same_coordinates' не определено

это забавно, потому что я клянусь, что я определил это двумя линиями выше corner_touching. Любая помощь будет принята с благодарностью !!!

Всего 4 ответа


Если пересечение для метода same_coordinates такое же, как и выше, то это метод класса, и вы должны вызывать его для объекта. Если вы переместите этот метод за пределы класса, он должен работать.


Что вы можете попробовать сделать это:

return self.same_coordinates(r1bl,r2tr) or self.same_coordinates(r1tl,r2br) or 
     self.same_coordinates(r1tr,r2bl) or self.same_coordinates(r1br,r2tl)

Дело в том, что ты сам в функции. В классе используйте self.FUNC для его вызова. Надеюсь это работает!


same_coordinates является атрибутом класса Rectangle , а не переменной в любой локальной или глобальной области видимости. Вам нужно получить к нему доступ через Rectangle или один из его экземпляров.

def corner_touching(self,r2):
    # ...

    return self.same_coordinates(r1bl, r2tr) or 
           self.same_coordinates(r1tl, r2br) or 
           self.same_coordinates(r1tr, r2bl) or 
           self.same_coordinates(r1br, r2tl)

Поскольку это атрибут, он также должен быть объявлен как статический метод, поскольку он принимает два экземпляра Point - но не экземпляр Rectangle - в качестве аргументов:

@staticmethod
def same_coordinates(P1,P2):
    return P1.x == P2.x and P1.y == P2.y

Или вы можете определить ее как глобальную функцию, и в этом случае вам не нужно будет изменять corner_touching :

def same_coordinates(P1, P2):
    return P1.x == P2.x and P1.y == P2.y


class Rectangle:
    "A class to manufacture Rectangle objects"

   def corner_touching(self,r2):
       # ...

       return same_coordinates(r1bl, r2tr) or 
              same_coordinates(r1tl, r2br) or 
              same_coordinates(r1tr, r2bl) or 
              same_coordinates(r1br, r2tl)

Используйте __eq__ магические методы. То, что вы пытаетесь сделать, это именно то, что делает __eq__ .

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

p1 = Point(3, 4)
p2 = Point(4, 4)
p3 = Point(3, 4)
print(p1 == p2) # will print False
print(p1 == p3) # will print True

Есть идеи?

10000