Klassen Methode asynchron in Python?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Du kannst __new__ einfach überschreiben und für diese Implementation vorgeben, dass sie ein Awaitable zurückgeben soll.

Beispiel:

import asyncio

class singleton(object):
  _instance = None

  async def __new__(cls, *args, **kwargs):
    if singleton._instance is None:
      instance = super().__new__(cls)
      await instance.__init__(*args, **kwargs)
      singleton._instance = instance

    return singleton._instance

  async def __init__(self, *args, **kwargs):
    # do some async stuff ...

Um eine Instanz des Singleton zu erzeugen, nutzt du künftig await.

some_obj = await singleton(123)

GettingHeart 
Beitragsersteller
 12.10.2024, 16:56

Hey, danke, das hat mir auf jeden Fall etwas weitergeholfen.

Jedoch habe ich nun das Problem, das meine IDE nicht mehr erkennt, welche Parameter in der Init Methode gefordert sind. Da stehen ausschließlich drei Punkte (…).

Gibt es dazu auch noch ein Fix?

Liebe Grüße

regex9  13.10.2024, 17:38
@GettingHeart

Probiere es mit benannten Parametern. Ich habe im obigen Code einfach nur args und kwargs als abstrakte/flexible Variante gewählt. Wenn das nicht ausreicht, könnte es helfen, der Funktion einen Docstring anzuheften.

Beispiel:

class singleton(object):
  def __init__(self, param1: str, param2: int):
    """Initializes a singleton object.
    @param1: Some description for param1.
    @param2: Some description for param2.
    """
    # your code ...    
GettingHeart 
Beitragsersteller
 14.10.2024, 21:46
@regex9

Ja, das hat geklappt.
Ich habe in der __new__ Methode *args und **kwargs durch ein namentlich genannten Parameter ausgetauscht und in der init Methode das genau gleiche und so erhalte ich die Parameter als Vorschläge wieder.

Code:

import asyncio


class SingletonPattern(object):
    """Die Klasse ist eine Beispiel Klasse, die nur dazu dient, um zu zeigen, wie man meine oben genannte Frage gelöst hat."""
    _instance = None

    async def __new__(cls, param):
        if cls._instance is None:
            cls._instance = await super().__new__(cls).__init__(param=param)

        return cls._instance


    async def __init__(self, param):
        print(param)



asyncio.run(SingletonPattern(param="Test"))

Danke für deine gute und hilfreiche Antwort auf meine Frage.