Форум сайта python.su
У меня есть объект webdriver.Chrome и мне нужно его использовать в 3 классах в одном модулей. Передвать объект драйвера из класса в класс не хочется и напрашивается решение с реализацией синглтона.
Каким я вижу использование этого синглтона?
class WebDriver: __driver = webdriver.Chrome pass driver = WebDriver.instance driver.get('python.su') page = driver.page_source()
Офлайн
Синглетон - это антипаттерн. Не надо его делать
Ну а если все же надо, тогда пользуемся __getattr__, __setattr__ и их товарищам.
Офлайн
4kpt_IVНу как бы да. Но все же! Хочу получить примерно такое:
Синглетон - это антипаттерн. Не надо его делать Ну а если все же надо, тогда пользуемся __getattr__, __setattr__ и их товарищам.
class Proba: __slots__ = ['__a'] def __init__(self, a=10): self.__a = a def set_a(self, value): self.__a = value def get_a(self): return self.__a class ProbaSingletonWrapper(object): __instance = None def __new__(cls): if not cls.__instance: ProbaSingletonWrapper.__instance = object.__new__(cls) return ProbaSingletonWrapper.__instance def __getattr__(self, name): return getattr(self.__instance, name) def __setattr__(self, name): return setattr(self.__instance, name)
>>>p1 = ProbaSingletonWrapper()
>>> p1.get_a()
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “d:\personal\projects\python-workspace\proba\singleton.py”, line 24, in __getattr__
return getattr(self.__instance, name)
File “d:\personal\projects\python-workspace\proba\singleton.py”, line 24, in __getattr__
return getattr(self.__instance, name)
File “d:\personal\projects\python-workspace\proba\singleton.py”, line 24, in __getattr__
return getattr(self.__instance, name)
RecursionError: maximum recursion depth exceeded while calling a Python object
Офлайн
Кажется понял, мне надо создать объект Proba и его подавать в getattr()
Офлайн
Вообще в __getttr__ лучше работать с __dict__ объекта.
Офлайн
Если не нужно какое-то особое поведение, то синглтон это просто класс без атрибутов объекта.
class mySingleton: a = 1 b = 2 print(mySingleton.a) mySingleton.a = 23 print(mySingleton.a)
Офлайн
FishHookНо верно ли я понимаю что a и b будут созданы на стадии загрузки модуля, а не создании объекта mySingleton?
Если не нужно какое-то особое поведение, то синглтон это просто класс без атрибутов объекта.
Офлайн
Ничего нет сложного в том, чтобы инициализировать атрибуты класса когда угодно.
class classproperty(object): def __init__(self, fget): self.fget = fget def __get__(self, owner, cls): return self.fget(cls) class mySingleton: _a = None @classproperty def a(cls): if cls._a is None: cls._a = get_my_property_a() return cls._a
Офлайн
Как-то так выходит.
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) return cls._instance
Офлайн
Это стандартный синглетон. Так сказать, классический. Именно так создается синглетон во всех учебных руководствах
Офлайн