Klassen Methode asynchron in Python?
Guten Tag,
da ich asynchron in Python arbeite und ein Singleton Pattern erstellen möchte, das für die Initialisierung der einzelnen Elemente zuständig ist, muss ich die __new__ Methode irgendwie asynchron erstellen.
Das Problem: Ich weiß nicht, wie ich das hinbekomme. Die asynchrone Funktion, die in der Methode aufgerufen werden soll, sollte man ja nicht via. asyncio.run aufrufen, da es dann zu Komplikationen mit den Tasks kommen kann. Eine andere Möglichkeit, die nichts negativ beeinflussen konnte ich (leider) nicht herausfinden.
Vielen Dank für eure Hilfe
Liebe Grüße
1 Antwort
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)
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 ...
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.
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