Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2017 01:37:34

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать singleton?

@4kpt_IV:
Да. Только вот не работает! ;)

Когда делаю так:

 Chrome().get('ya.ru')
Chrome().get('google.com')

То ожидаю, что запустится один экземпляр браузера, а потом в нем откроется страница яндекса. А затем откроется в этом же браузере страница гугла.

Результат: Далеко не так. Открывается 2 экземпляра браузера. В первом открывается яндекс, а во втором гугл.

Как вывод: не совсем уж и Синглтон. Иначе почему два раза браузер стартует? ;)



Офлайн

#2 Янв. 14, 2017 22:16:52

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Как реализовать singleton?

 #!/usr/bin/env python
from selenium import webdriver
def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance
@singleton
class Firefox(webdriver.Firefox):
    pass
if __name__ == '__main__':
    Firefox().get('https://www.ya.ru')
    Firefox().get('https://www.google.com')

Отредактировано WoMax (Янв. 15, 2017 01:06:21)

Офлайн

#3 Янв. 15, 2017 17:52:59

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать singleton?

WoMax
Как работает ваш код понимаю. Но не понимаю, а почему мой-то не работает? Что в нем не хватает?



Офлайн

#4 Янв. 15, 2017 19:44:22

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Как реализовать singleton?

sys_dev
Но не понимаю, а почему мой-то не работает? Что в нем не хватает?
Ваш код - синглтон, просто работает не так как вы ожидаете. Дело в реализации самого вебдрайвера.
Там есть атрибут session_id, который присваивается в ините. В итоге в вашей реализации синглтона он присваивается каждый раз заново и поэтому открывается новое окно. В предложенном мной варианте он уже проинициализирован и поэтому работает так как вам надо.

Офлайн

#5 Янв. 16, 2017 11:51:54

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать singleton?

Итого:
Либо вариант от @WoMax либо этот(моего друга):

 from selenium import webdriver
class Chrome(webdriver.Chrome):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls, *args, **kwargs)
            super().__init__(cls._instance, *args, **kwargs)
        return cls._instance
    def __init__(self, *args, **kwargs):
        pass



Отредактировано sys_dev (Янв. 16, 2017 11:52:33)

Офлайн

#6 Янв. 16, 2017 12:31:27

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Как реализовать singleton?

 from selenium import webdriver
class Chrome(webdriver.Chrome):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls, *args, **kwargs)
            super().__init__(cls._instance, *args, **kwargs)
        return cls._instance
    def __init__(self, *args, **kwargs):
        pass

жуткий костыль =/

Офлайн

#7 Янв. 16, 2017 14:58:50

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать singleton?

WoMax
жуткий костыль =/
Это почему ж? :) Работает же! ;)



Отредактировано sys_dev (Янв. 16, 2017 14:59:16)

Офлайн

#8 Янв. 16, 2017 15:24:39

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Как реализовать singleton?

sys_dev
А Вы можете пояснить, что в нем происходит? Когда распишите по пунктам - сами поймете

Отредактировано 4kpt_IV (Янв. 16, 2017 15:24:51)

Офлайн

#9 Янв. 16, 2017 17:34:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как реализовать singleton?

А чем не устраивает мой вариант?



Офлайн

#10 Янв. 17, 2017 10:57:01

sys_dev
От:
Зарегистрирован: 2011-06-22
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать singleton?

FishHook
А чем не устраивает мой вариант?
При вашем варианте возникает запах “поезд”. Об этом в общеизвестной книге про рефакторинг. Пример:
obj.subobj1.subobj2.subobj3.

Вы предложили MyInstance.a. Здесь объект a создает доп. цепь.

В том варианте который мне предложили с декоратором этой доп.цепи нет и использование становится более простым:

 Chrome().get('http://ya.ru')

В вашем же пример это было бы как то так:

 MySingleton.chrome.get('https://ya.ru')



Отредактировано sys_dev (Янв. 17, 2017 11:00:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version