Python, межклассовые отношения и зависимости от объектов

Редактировать

Извиняюсь за предыдущую общность!

Настоящим я пытаюсь быть яснее. Я тестирую изображение, поэтому я должен написать ряд методов, которые будут запускаться для анализа изображения. Не все протестированные изображения будут одинаковыми, поэтому мне нужен объект для каждого изображения. Многие из методов, которые я буду писать, не работают со всем изображением. Например, у меня есть метод, который возвращает расстояние точки массива от центра изображения, используя константу интервала между пикселями, которая является атрибутом изображения. Здесь у меня есть пример, я читаю изображение и тем самым создаю изображение объекта и некоторые атрибуты, которые мне пригодятся. Но мои точечные объекты, принадлежащие этому изображению, не будут иметь доступа к этим атрибутам, если у них есть собственный класс; полезно иметь класс точек, потому что другой анализ также использует точки и использует те же методы.

    class image(object):
    def __init__(self, filepath)
    #creates an instance of the image from filepath
        xscale = self.read_header(xspacing)
        xscale = self.read_header(yspacing) #pixels per mm property of image

    class point(object):
    def __init__(slef, i,j)
    self.i = i # array position in image.
    self.j = j
    self.x = self.i * xscale #real position in mm in image
    self.y = self.i * yscale ##but xscale and y scale are not in scope here.

Итак, вопрос в том, как мне задать атрибуты точечных объектов, такие как расстояние, которые зависят от атрибута изображения, такого как xscale и yscale. На мой взгляд, я хочу, чтобы image.point.x был разрешен, где image.point.x зависит от image.xscale. Небольшое осложнение, которое, я думаю, мы можем пока проигнорировать, заключается в том, что точка не должна существовать вне контекста изображения, потому что наличие точки без атрибутов изображения, таких как масштаб, ничего не значит. Я надеюсь, что это понятнее и в целом полезнее. Спасибо.

Оригинальный вопрос.

Я хотел бы иметь открытый образ. Изображение должно быть объектом, так как с ним связано множество методов.. например. чтение информации заголовка и присвоение объекту множества атрибутов, таких как title, sizex, sizey...

Тогда изображения, очевидно, состоят из точек = поэтому я подумал, что у меня будет класс точек. Затем я мог бы определить объект Point, и он мог бы иметь атрибуты, такие как положение (в зависимости от некоторых констант расстояния между пикселями из заголовка изображения). И этот класс будет иметь множество точечных методов, таких как расстояние, изменение значения, перемещение, масштабирование, опрос между двумя точками.... и т.д.

Моя проблема состоит из двух частей. Создание точечных объектов действительно должно зависеть от существования объекта изображения. Я не знаю, как python обрабатывает такое условное создание объектов. И, во-вторых, точечный объект должен знать об объекте изображения, к которому он относится. В идеале у меня был бы Image.Point(x,y), и это означало бы, что точка x,y существует в изображении, и поэтому она могла бы иметь доступ ко всем переменным, созданным при инициализации объекта изображения. Я надеюсь, что все это имеет смысл. Я пробовал super, но, похоже, он не выполняет условный бит и запускает метод в базовом классе, где я просто хочу, чтобы некоторые переменные были доступны.

Спасибо за любую помощь.


person Andrew    schedule 02.07.2011    source источник
comment
Создание точечных объектов действительно должно зависеть от существования объекта изображения. Я не знаю, как python обрабатывает такое условное создание объектов. Объекты создаются, когда вы указываете Python сделать это. Нет никакого автоматического создания или чего-то еще, вы бы сделали, чтобы объект Image создавал свои собственные объекты Point при инициализации. Вы уверены, что вам нужен балльный класс? Как насчет: (x, y) для представления точки?   -  person phant0m    schedule 02.07.2011
comment
@Andrew Эндрю - Понятно, что у вас есть проблема, над которой вы потратили некоторое время на размышления, но не совсем ясно, о чем вы спрашиваете. Не могли бы вы опубликовать код (или псевдокод), чтобы лучше проиллюстрировать то, что вы просите? Я вижу, что некоторые голосуют за закрытие вашего вопроса. Если это произойдет, не стесняйтесь опубликовать новый с более подробным описанием проблемы! :)   -  person mac    schedule 02.07.2011
comment
@mac - Спасибо, я попытался улучшить вопрос.   -  person Andrew    schedule 02.07.2011
comment
@ phant0m - Если я скажу python создать точечный объект, он сделает это в зависимости от правил внутри класса точек. На самом деле эта точка существует только в контексте определенного образа. Возможно, это местонахождение глаза, возвращенное методом распознавания лиц; этот момент относится только к этой фотографии. Если у меня нет класса точек, я, вероятно, буду повторять методы в разных классах. Например, определение расстояния (точка1, точка2) полезно при анализе фотографий и анализе слайдов микроскопа, но я не хочу читать оба этих изображения с одним и тем же классом.   -  person Andrew    schedule 02.07.2011


Ответы (2)


поэтому вы хотите, чтобы у изображения был метод, который возвращает точки на этом изображении (фабрика точек), например:

class Image:
    #...
    def point_at(self, x,y):
        return PointInImage(self, ...)
    #...

class PointInImage:
    #...
    def __init__(self, image, ...):
        self.image = image
        #...
    #...
person Dan D.    schedule 02.07.2011
comment
Д., Спасибо вам за это. возврат инструкции для создания объекта другого класса кажется мне новым. Здесь я указываю, что две недели назад я никогда не занимался объектно-ориентированным программированием. Спасибо всем. - person Andrew; 02.07.2011

Вы можете сделать это следующим образом:

class Point(object):
    def __init__(self, image):
        self._image = image

class Image(object):
    def __init__(self, width, height):
        self._points = [Point(self) for unused in range(width * height)]

Таким образом, для каждой точки требуется изображение при инициализации, и каждое изображение имеет список связанных с ним точек. Обратите внимание, что, поскольку вы создадите много Point-экземпляров, которые могут занимать много памяти, вам следует рассмотреть возможность использования слоты для Point.

person Björn Pollex    schedule 02.07.2011
comment
Спасибо. Для каждого изображения может быть от 8 до 12 точек, которые меня интересуют. Мне кажется глупым перечислять все точки, когда так мало полезных. Однако мне нужно запускать достаточно сложные методы для этих нескольких точек, поэтому для меня имеет смысл иметь класс точек. - person Andrew; 02.07.2011