Найти - Пользователи
Полная версия: Как реализовать singleton?
Начало » Python для новичков » Как реализовать singleton?
1 2 3
sys_dev
@4kpt_IV:
Да. Только вот не работает! ;)

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

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

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

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

Как вывод: не совсем уж и Синглтон. Иначе почему два раза браузер стартует? ;)
WoMax
 #!/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')
sys_dev
WoMax
Как работает ваш код понимаю. Но не понимаю, а почему мой-то не работает? Что в нем не хватает?
WoMax
sys_dev
Но не понимаю, а почему мой-то не работает? Что в нем не хватает?
Ваш код - синглтон, просто работает не так как вы ожидаете. Дело в реализации самого вебдрайвера.
Там есть атрибут session_id, который присваивается в ините. В итоге в вашей реализации синглтона он присваивается каждый раз заново и поэтому открывается новое окно. В предложенном мной варианте он уже проинициализирован и поэтому работает так как вам надо.
sys_dev
Итого:
Либо вариант от @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
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
WoMax
жуткий костыль =/
Это почему ж? :) Работает же! ;)
4kpt_IV
sys_dev
А Вы можете пояснить, что в нем происходит? Когда распишите по пунктам - сами поймете
FishHook
А чем не устраивает мой вариант?
sys_dev
FishHook
А чем не устраивает мой вариант?
При вашем варианте возникает запах “поезд”. Об этом в общеизвестной книге про рефакторинг. Пример:
obj.subobj1.subobj2.subobj3.

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

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

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

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

 MySingleton.chrome.get('https://ya.ru')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB