Способ изменения поведения на основе вызывающей стороны с использованием свойства getter без отражения или превращения вызывающей стороны в член Python - PullRequest
0 голосов
/ 08 марта 2012

Итак, я пишу тестовый фреймворк для большого сайта и сейчас работаю над моделированием драйвера пользовательского интерфейса.У меня есть UI Session, который абстрагирует ряд эмуляторов и драйверов для браузеров и мобильных устройств.этот объект также содержит информацию о состоянии сеанса браузера, включая историю объектов страницы, в верхней части которой находится текущая страница.Моя проблема в том, что я хочу, чтобы объекты моей страницы лениво загружали данные из браузера (свойства, установленные с помощью методов получения, которые проверяют, извлекли ли мы данные, если нет, является ли это текущей страницей, и если да, извлекают данные избраузер и кэширует его в объекте страницы), но это означает, что им нужен доступ к уровню абстракции, предоставляемому сеансом.

Первой идеей, конечно, было просто прикрепление сеанса на странице, но это создаеткруговая ссылка, что плохо.Я также подумал о том, чтобы попытаться определить несколько интерфейсов для страницы, но я не мог понять, как это будет работать слишком хорошо.Что я действительно хочу, так это иметь возможность перехватывать вызов в сеансе, а затем сеанс перенаправлять вызов вниз на страницу к скрытому получателю, который также принимает сеанс в качестве аргумента, но я не смог выяснить, как это сделать.

Есть ли хорошее решение или шаблон проектирования, который я мог бы использовать здесь, чтобы получить необходимую информацию и доступ там, где она мне нужна, без циклических ссылок или отказа от отложенной загрузки?Я не хочу усложнять интерфейс, заставляя пользователей иногда вызывать методы, а иногда вызывать свойства или члены для доступа к одной и той же информации (идея состоит в том, чтобы скрыть закулисную работу за кулисами и упростить использование инфраструктуры).

У меня действительно есть класс CurrentPage, который все, что он делает, это сохраняет current_page в переменной класса, которая устанавливается сессией при событиях навигации, поэтому я полагаю, что я мог бы сделать current_page волшебным средством доступа global-esque, которое было быединственный способ на самом деле получить данные со страницы и использовать их со специальным интерфейсом и сохранять объект сеанса, но мне это кажется неуклюжим.

У кого-нибудь есть предложения?

1 Ответ

1 голос
/ 08 марта 2012

Вы сказали:

"Конечно, первой идеей было просто прикрепить сеанс на странице, но это создает циклическую ссылку, что плохо."

Но это не правда. Циркулярные ссылки не будут сразу же собираться мусором, как некруглые, и методы __del__ не будут вызываться, но при условии, что вы знаете оба этих ограничения и не сталкиваетесь с нуждами их круговые ссылки в порядке. См:

http://docs.python.org/reference/datamodel.html#object.__del__

Хорошо, если на страницах хранится ссылка на сеанс.

Редактировать: если сессия и страница находятся в разных файлах, а циклический импорт становится проблемой, вы можете использовать такой подход:

# session.py
import page
class Session(object):
    def __init__(self):
        self.page_list = []
    def addPage(self, url):
        self.page_list.append(page.Page(self, url))

# page.py
class Page(object):
    def __init__(self, session, url):
        self.session = session
        self.url = url

Пока вам не нужно создавать Сеансы внутри page.py, вам вообще не нужно будет их импортировать, так как не будет необходимости в Session-столице ( класс). Если это изменится, вы можете сделать что-то вроде:

# page.py
class Page(object):
    # ...
    def something(self):
        import session
        self.other_session = session.Session()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...