LINUX.ORG.RU

Не до конца определенные объекты в Python3

 , ,


1

2

Всем привет!

Ищу способ сделать конструктор класса обработчика события каррируемым. Звучит достаточно дико для людей, знакомых с ООП, но суть примерно в этом. Если кратко, то http-серверу мне надо передать класс обработчика запросов (у которого должно быть 3 параметра). Таких серверов, имеющих дело с одной БД, должно быть штуки 3, работающие на разных портах. Соответственно, я не хочу в каждом конструкторе писать один и тот же код соединения с БД, а хочу передать параметром в конструктор обработчика само соединение с БД (pymysql) в соответствии с канонами Dependency Injection. Проблема в том, что для написания этого кода вероятнее всего должны понадобиться placeholder-ы (по крайней мере, в С++ было бы так), для того, чтобы сказать, какие аргументы мы передаем дальше на обработку, а какие - используем сейчас.

В общем, я хочу примерно такой код:

class ServerHandler(BaseHTTPRequestHandler):
    def __init__(self, connection, a,b,c)
...

def run():
    conn = pymysql.connect(host=LOCALHOST, user=DB_USER, 
        passwd=DB_PASS, db=DB_NAME)
    server_address = (LOCALHOST, PORT)    
    httpd = HTTPServer(server_address, ServerHandler(conn, ...))
    httpd.serve_forever()
    conn.close()

★★

Я пять минут пытался въехать в описание, но так ничего и не понял. Если хочешь чтобы я помог то приведи код целиком, чтобы было видно что есть какие-то куски которые повторяются. А пока мне кажется что ты слишком увлёкся паттернами.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Повторяться будет кусок с conn = pymysql.connect(host=LOCALHOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME)

aido ★★ ()

Сделай фабрику же:

class A:
	def __init__(self, a, b, c):
		self.a, self.b, self.c = a, b, c
		
	def __repr__(self):
		return 'A({}, {}, {})'.format(self.a, self.b, self.c)
	
class A_factory:
	def __init__(self, a):
		self.a = a
	
	def __call__(self, b, c):
		return A(self.a, b, c)
		
print(A_factory(1)(2, 3))
https://ideone.com/j0k5o5

anonymous ()

Лямбда? И в C++ была бы лямбда, placeholder'ы это ненужный костыль.

slovazap ★★★★★ ()

Это, вообще то к каррированию не имеет отношения, и, кстати, для ООП это как раз нормально, это в ФП все извращено.

А в чем проблема сделать так, ни хрена не понятно. Возвращай из замыканий конструкторы, например.

portquest2016 ()
Ответ на: комментарий от anonymous

Еще рекомендую ТСу прочитать какую-нибудь книжку или веб-страницу с паттернами проектирования.

Вот тут есть описания на русском: https://ru.wikipedia.org/wiki/Шаблон_проектирования

Вот тут есть готовые реализации: https://github.com/faif/python-patterns

Но лучше какую-нибудь книжку, где всё это хорошенько детально разжуют

stevejobs ★★★☆☆ ()
Ответ на: комментарий от aido

Ящитаю ты делаешь неправильно. Во-первых, функцией было бы даже проще:

def fixed-arg(a):
  def wrapped(b,c):
    return A(a,b,c)

Во-вторых, всё ещё не понятно в чём проблема инициализировать переменную один раз и использовать её столько раз сколько нужно.

И да, к ООП это вообще никак не относится.

true_admin ★★★★★ ()
Последнее исправление: true_admin (всего исправлений: 1)

яничегонепонял

http-серверу мне надо передать класс обработчика

судя по коду, ты передаёшь экземпляр класса, то есть, объект, а не класс

хочу передать параметром в конструктор обработчика само соединение с БД

не вижу проблемы

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.