La réponse acceptée (qui me semble incorrecte) indique que vous ne pouvez pas, et que vous devriez plutôt faire ;
class Comedian:
def __init__(self, *jokes):
self.jokes = jokes
def __enter__(self):
jokes = self.jokes
#say some funny jokes
return self
et bien que ce soit souvent ce que vous feriez, ce n'est pas toujours la meilleure solution, ou même a solution, et c'est définitivement pas la seule solution ! ..
Je suppose que ce que vous voulez, c'est être capable de faire quelque chose de similaire à ;
funny_object = Comedian()
with funny_object('this is a joke') as humor:
humor.say_something_funny()
Si c'est le cas, et que ce n'est pas plus compliqué que cela, alors vous pouvez tout simplement le faire ;
class Comedian:
def __enter__(self):
jokes = self.jokes
#say some funny jokes
return self
def __call__(self, *jokes):
self.jokes = jokes
De cette façon, vous pouvez toujours initialiser l'objet avec tous les arguments que vous voulez, et faire n'importe quelle autre chose avec l'objet comme vous le feriez habituellement, mais lorsque vous voulez utiliser l'objet comme un gestionnaire de contexte, vous appelez d'abord sa fonction appelez et configurer quelques arguments pour le gestionnaire de contexte.
L'important ici est de comprendre exactement comment les gestionnaires de contexte fonctionnent en Python.
En Python, un gestionnaire de contexte est tout objet qui définit un entrez méthode. Cette méthode est appelée automatiquement lorsque vous le faites ;
with object as alias:
alias.do_stuff()
..
Remarquez que l'objet n'est pas suivi de deux "()", qu'il s'agit d'un appel de fonction implicite et qu'il ne prend aucun argument.
Vous avez peut-être eu l'idée de passer des arguments à entrez de ;
with open(filename) as file:
"do stuff with file..
Mais ceci est différent de la substitution de entrez car "ouvert" n'est pas un objet, mais une fonction.
Un bon exercice consiste à ouvrir une console python interactive et à taper "open" + [ENTER].
>>> open
<built-in function open>
"open" n'est pas un gestionnaire de contexte objet mais fonction . Il n'a pas de entrez mais elle est définie de la manière suivante ;
@contextmanager
def open(..):
...
vous pouvez définir vos propres fonctions de gestionnaire de contexte de la même manière, vous pouvez même remplacer la définition de "open".
IMO cependant, la meilleure chose à faire si vous devez créer un objet et l'utiliser plus tard comme un gestionnaire de contexte avec des arguments ( ce que je fais) est de donner à l'objet une méthode qui retourne un objet temporaire qui définit un entrez comme suit ;
class Comedian:
def context(audience):
class Roaster:
context = audience
def __enter__(self):
audience = self.__class__.context
# a comedian needs to know his/her audience.
return Roaster(audience)
funny_thing = Comedian()
with funny_thing.context('young people') as roaster:
roaster.roast('old people')
L'ordre de la chaîne d'appel dans cet exemple est le suivant ; Comédien. init () -> Comedian.context(args) -> Roaster. entrez ()
J'avais l'impression que cette réponse manquait dans le lot, alors je l'ai ajoutée.