Singletony w Pythonie

0

Python. jak przystało na jednego z najbardziej zabałaganionych języków, ma wiele implementacji singletona, których większość jest nieczytelna.

Najprostszy, choć dziwny, sposób jaki znalazłem:

(od 9 minuty)

Czy taki sposób jest dobrą praktyką? I w ogóle jak to a wyglądać na przykładzie? Co ma być w zamian za my_mode?

GLOBAL = 0

class Singl:
    
    def __init__():
        global GLOBAL
        GLOBAL = GLOBAL + 1
        
from my_code import Singl

print(Singl)
print(GLOBAL)

ModuleNotFoundError: No module named 'my_code'

1

http://code.activestate.com/recipes/66531-singleton-we-dont-need-no-stinkin-singleton-the-bo/
btw, singletony są passe. Z czasem zacząłem wątpić, że ma realne zastosowanie.

0
spartanPAGE napisał(a):

http://code.activestate.com/recipes/66531-singleton-we-dont-need-no-stinkin-singleton-the-bo/
btw, singletony są passe. Z czasem zacząłem wątpić, że ma realne zastosowanie.

Singletony w Pythonie: None, True, False, (), frozenset() (puste, niezmienne kolekcje), importowane moduły.

2

Jak już koniecznie musisz, MUSISZ używać singletonów - proszę bardzo, możesz sobie to ogarnąć np dekoratorem na klasę ;]

from functools import wraps

def singleton(*args, **kwargs):
  def outer_wrapper(cls):
    instance = cls(*args, **kwargs)
    @wraps(cls)
    def inner_wrapper():
      return instance
    return inner_wrapper
  return outer_wrapper

i potem dekorować nim sobie klasy :D

@singleton(foo=1)
class Foo:
  def __init__(self, foo):
    self.foo = foo

  def print(self):
    print("Foo says {}".format(self.foo))

Działa? Zobaczmy:

>>> foo = Foo()
>>> foo.print()
Foo says 1
>>> foo
<__main__.Foo object at 0x00000268BA885EF0>
>>> bar = Foo()
>>> bar.print()
Foo says 1
>>> bar
<__main__.Foo object at 0x00000268BA885EF0>
>>> foo == bar
True
>>>

Chyba działa ;)

4
Julian_ skomentował:

http://code.activestate.com/recipes/66531-singleton-we-dont-need-no-stinkin-singleton-the-bo/
w skrypcie wieloktronie potrzebuję się odwołać do tabeli bazodanowej w taki sam sposób. Jak inaczej jak nie singletonem? Globalną, statyczną zmienną zrobić?

Bazę danych chowasz za fasadą.
Baza danych to tylko zaawansowane IO device, więc kod powinien być napisany tak, by można było ją zastąpić czymkolwiek innym (ma być odseparowana od logiki biznesowej).
Jeśli zrobisz ją jako singleton to przerośnie cały twój kod i będziesz trwale uwiązany do tego rozwiązania.

Polecam filmy z Uncule Bobem, który mówi jak projektować aplikacje i tłumaczy czemu baza danych powinna być wtyczką do reguł biznesowych.
Jest skupiony na Java, ale jego rady można uogólnić na dowolny język.

1 użytkowników online, w tym zalogowanych: 0, gości: 1