Comment retourner une valeur de __init__ en Python?
Question
J'ai une classe avec une fonction __init__
.
Comment puis-je retourner une valeur entière de cette fonction lorsqu'un objet est créé?
J'ai écrit un programme, où __init__
fait l'analyse syntaxique de la ligne de commande et je dois avoir un ensemble de valeurs. Est-il acceptable défini dans la variable globale et l'utiliser dans d'autres fonctions membres? Si oui, comment le faire? Jusqu'à présent, je déclarais une variable en dehors des cours. et sa mise en une fonction ne reflète pas dans d'autres fonctions ??
La solution
__init__
doit retourner Aucun. Vous ne pouvez pas (ou du moins ne devrait pas) retourner autre chose.
Essayez de faire tout ce que vous voulez retourner une variable d'instance (ou la 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
Autres conseils
Pourquoi voudriez-vous faire?
Si vous voulez retourner un autre objet quand 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
De la de __init__
:
une contrainte particulière sur les constructeurs, aucune valeur peut être renvoyée; Ce faisant provoquera une TypeError à soulever lors 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'
Exemple d'utilisation de la matière en question peut être comme:
class SampleObject(object)
def __new__(cls,Item)
if cls.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 que je ne peux pas écrire un commentaire, il est fou! Je voudrais pouvoir poster un commentaire à Weronika
La méthode __init__
, comme d'autres méthodes et fonctions par défaut retourne Aucun en l'absence d'une déclaration de retour, de sorte que vous pouvez l'écrire comme l'une de celles-ci:
class Foo:
def __init__(self):
self.value=42
class Bar:
def __init__(self):
self.value=42
return None
Mais, bien sûr, en ajoutant le return None
ne vous achète pas quoi que ce soit.
Je ne sais pas ce que vous recherchez, mais vous pourriez être intéressé par un de ces:
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
__init__
ne retourne rien et doit toujours revenir None
.
Je voulais juste ajouter, vous pouvez retourner dans les classes __init__
@property
def failureException(self):
class MyCustomException(AssertionError):
def __init__(self_, *args, **kwargs):
*** Your code here ***
return super().__init__(*args, **kwargs)
MyCustomException.__name__ = AssertionError.__name__
return MyCustomException
La méthode ci-dessus vous aide à mettre en œuvre une action spécifique sur une exception dans votre test
Vous pouvez simplement le mettre à une variable de classe et de le lire à partir du programme principal:
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
Eh bien, si vous ne se soucient pas de l'instance d'objet plus ... vous pouvez simplement le remplacer!
class MuaHaHa():
def __init__(self, ret):
self=ret
print MuaHaHa('foo')=='foo'