web-dev-qa-db-fra.com

Comment retourner une valeur de __init__ en Python?

J'ai une classe avec une fonction __init__

Comment puis-je retourner une valeur entière à partir de cette fonction lorsqu'un objet est créé?

J'ai écrit un programme où __init__ effectue l'analyse syntaxique en ligne de commande et il est nécessaire que certaines valeurs soient définies. Est-il possible de le définir dans une variable globale et de l'utiliser dans d'autres fonctions membres? Si oui, comment faire ça? Jusqu'à présent, j'ai déclaré une variable en dehors de la classe. et le régler une fonction ne reflète pas dans une autre fonction?

83
webminal.org

__init__ est requis pour renvoyer None. Vous ne pouvez pas (ou du moins ne devriez pas) retourner autre chose.

Essayez de faire ce que vous voulez pour retourner une variable d'instance (ou une fonction).

>>> class Foo:
...     def __init__(self):
...         return 42
... 
>>> foo = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None
89
Can Berk Güder

Pourquoi voudriez-vous faire ça?

Si vous voulez renvoyer un autre objet lorsqu'une classe est appelée, utilisez la méthode __new__():

class MyClass(object):
    def __init__(self):
        print "never called in this case"
    def __new__(cls):
        return 42

obj = MyClass()
print obj
94
Jacek Konieczny

À partir de documentation de __init__ :

En tant que contrainte spéciale sur les constructeurs, aucune valeur ne peut être renvoyée. cela provoquerait une erreur TypeError au moment de l'exécution.

Pour preuve, ce code:

class Foo(object):
    def __init__(self):
        return 2

f = Foo()

Donne cette erreur:

Traceback (most recent call last):
  File "test_init.py", line 5, in <module>
    f = Foo()
TypeError: __init__() should return None, not 'int'
37
nosklo

Exemple d'utilisation de la matière en question peut être comme:

class SampleObject(object)

    def __new__(cls,Item)
        if self.IsValid(Item):
            return super(SampleObject, cls).__new__(cls)
        else:
            return None

    def __init__(self,Item)
        self.InitData(Item) #large amount of data and very complex calculations

...

ValidObjects=[]
for i in data:
    Item=SampleObject(i)
    if Item:             # in case the i data is valid for the sample object
        ValidObjects.Append(Item)

Je n'ai pas assez de réputation donc je ne peux pas écrire de commentaire, c'est fou! J'aimerais pouvoir le poster en commentaire à weronika

13
PMN

La méthode __init__, à l'instar des autres méthodes et fonctions, renvoie None par défaut en l'absence d'une instruction return, afin que vous puissiez l'écrire comme suit:

class Foo:
    def __init__(self):
        self.value=42

class Bar:
    def __init__(self):
        self.value=42
        return None

Mais, bien sûr, ajouter le return None ne vous rapporte rien.

Je ne suis pas sûr de ce que vous recherchez, mais vous pourriez être intéressé par l'un de ceux-ci:

class Foo:
    def __init__(self):
        self.value=42
    def __str__(self):
        return str(self.value)

f=Foo()
print f.value
print f

impressions:

42
42
12
quamrana

__init__ ne renvoie rien et devrait toujours renvoyer None.

8
gruszczy

Je voulais juste ajouter, vous pouvez retourner les classes dans __init__

@property
def failureException(self):
    class MyCustomException(AssertionError):
        def __init__(self_, *args, **kwargs):
            *** Your code here ***
            return super().__init__(*args, **kwargs)

    MyCustomException.__= AssertionError.__name__
    return MyCustomException

La méthode ci-dessus vous aide à mettre en œuvre une action spécifique sur une exception dans votre test.

2
Eugene Nosenko

Vous pouvez simplement le définir sur une variable de classe et le lire à partir du programme principal:

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode
0
PythonPro