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?
__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
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
À 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'
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
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
__init__
ne renvoie rien et devrait toujours renvoyer None
.
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.
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