Python Class a potomci

16 views
Skip to first unread message

Fa...@orkasystems.cz

unread,
Jan 31, 2021, 2:52:20 PM1/31/21
to django-cs
Ahoj,

řeším následující problém. Mám třídu LmsDb která řeší připojení k databázi vypada to nějak takhle:

class LmsDbClass:
    def __init__(self):
        self.options = LmsIniReader(lmsini_filename)
        self.Database = pymysql.connect(host=self.options.dbhost,
                                        user=self.options.dbuser,
                                        password=self.options.dbpasswd,
                                        db=self.options.dbname)

    def open(self):
        self.Database.open()

....

Tak a ted resim, jak tuto tridu využívat, pokud z ní udělám potomky. Takhle to mam

class TesstLms(LmsDbClass):
    def __init__(self):
        LmsDbClass.__init__(self)

ale co mi vadi, ze kazdy potomek vytvori novou instanci toho LmsDbClass, chtel bych aby to bylo jen jednou.

Jasne, mohu udelat neco takoveho:
Njeprve si vytvorim LmsDbClass

lmsdata = LmsDbClass()

a potomky upravim nejak takhle:
class TesstLms:
    def __init__(self, lmsdata:LmsDbClass):
    self.lmsdata = lmsdata


Jako funguje to, ale chtel bych se zeptat, jestli Python umí nějaký odkaz na již vytvořený objekt,  idealne neco takoveho :

class TesstLms:
    def __init__(self):
    if globalnitridaLmsDbClass = None:
        globalnitridaLmsDbClass = LmsDbClass()
    self.lmsdata = globalnitridaLmsDbClass 


Jsem uplne mimo mísu? :)





Petr Blahoš

unread,
Feb 1, 2021, 4:40:09 AM2/1/21
to djan...@googlegroups.com
Totiž, my neznáme Tvůj úmysl, ale kdybych si měl dovolit hádat, tak:

   Odděl databázovou funkcionalitu od připojení k databázi.

To znamená, že v jednom modulu budeš mít funkce, které zajistí připojení k databázi,
connection pooling, transakce, apod., a ve dalších modulech budeš mít tu databázovou
logiku nebo moderněji Business Intelligence - generování SQL. Na a pak v prostředí se 
nějak vytvoří "connection", a pak se řekne: Proveď business intelligence s tímto spojením. 

Dovolím si doporučit SQLAlchemy, která podporuje různé možnosti u připojení k databázi
(bez/s connection pooling, bez/s transakcemi), i různé způsoby jak generovat sql ať už
použitím raw sql, generováním sql pomocí pythonu, nebo ORM. SQLAlchemy je hodně 
rozšířená, a jestli používáš nějaký framework, tak tam dost možná bude podpora.

Jestli se ptáš na konferenci django, tak možná děláš s Django, tak použij postupy běžné
v Django (ale s tím už neporadím já).

--
Petr



--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/8a5c788b-32f0-48e3-a088-822bf4389583n%40googlegroups.com.


--

Daniel Kopecký

unread,
Feb 3, 2021, 8:22:56 AM2/3/21
to djan...@googlegroups.com
Čau,

nečetl jsem důkladně tvůj problém, ale pokud chceš odkazovat na již vytvořenou instanci, tak použij Singleton pattern (https://python-patterns.guide/gang-of-four/singleton/). Pozor na implementace, na netu nalezneš stovky, ale některé jsou nevhodné. 


Hezký den
Dan

ne 31. 1. 2021 v 20:52 odesílatel Fa...@orkasystems.cz <Fa...@orkasystems.cz> napsal:
Reply all
Reply to author
Forward
Message has been deleted
0 new messages