Я работаю над созданием программы отслеживания видения с использованием конвейера. В моем трубопроводе у меня есть следующий код:Переменные объекта без сброса
@staticmethod
def __approx_contours(input_contours):
output = []
kp = None
for contour in input_contours:
error = 0.1*cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, error, True)
print(approx)
kp = Keeper(approx)
print(kp)
if kp == None:
return output
for x,y in zip(kp.getX(),kp.getY()):
output.append((x,y))
kp.empty()
return output
и вот KEEPER класс
class Keeper:
_x = []
_y = []
# constructor, requires a 3-D array
def __init__(self, third_dim):
if third_dim.ndim == 3:
for row in third_dim:
for col in row:
self._x.append(col[0])
self._y.append(col[1])
else:
raise NotThirdDimension("Entered array was not three dimensional")
print(self._x)
print(self._y)
# return object "X" array
def getX(self):
return self._x
# return object "Y" array
def getY(self):
return self._y
def empty(self):
self._x = []
self._y = []
Игнорируйте заявления печати в __init__
, они предназначены только для отладки.
Пример выходных данных в текущем состоянии:
[[[183 169]]
[[187 323]]]
Keeper
[183, 187]
[169, 323]
<keeper.Keeper object at 0x05199630>
[[[ 62 117]]
[[ 93 366]]
[[187 256]]]
Keeper
[183, 187, 62, 93, 187]
[169, 323, 117, 366, 256]
<keeper.Keeper object at 0x06F10B70>
Представляется, что значения в моем объекте хранитель не сбрасывается, несмотря вызова kp.empty(). Я также отметил, что объект Keeper меняет место в памяти, возможно, это часть проблемы, но я не уверен, где я ошибаюсь. Полный код доступен here
Вы не должны писать геттеры и сеттеры в Python. Кроме того, вы создали атрибуты класса '_x' и' _y' * *, которые, скорее всего, не предназначены для вас. Кроме того, ваш метод '__approx_contours' должен, вероятно, просто быть функцией уровня модуля, а не статическим методом ... почему' __'-man-ключ? Является ли это прецедентом для манипулирования именами? Если нет, то не делайте этого. В общем, 'Python! = Java' –
Как именно вы вызываете свой статический метод? Вы только опорожняете его в конце. Вероятно, проблема возникает из-за того, что вместо переменных экземпляра * вы делаете переменную класса '_x' и' _y' * *. Затем, когда вы делаете 'self._x = []; self._y = [] 'в' empty' вы * создаете новые переменные экземпляра, которые теневые переменные класса *. Но вы уже мутировали переменные класса, и изменения все равно будут видны, даже если вы используете 'empty'. –
Кроме того, объект 'Keeper' не меняется в памяти, вы делаете новый объект на каждой итерации цикла:' kp = Keeper (approx) '. –