Como retornar um valor de __init__ em python?
Pergunta
Eu tenho uma aula com um __init__
função.
Como posso retornar um valor inteiro dessa função quando um objeto é criado?
Eu escrevi um programa, onde __init__
A análise da linha de comando e eu preciso ter algum conjunto de valor. Tudo bem, defina -o na variável global e use -o em outras funções de membro? Se sim, como fazer isso? Até agora, declarei uma variável fora da classe. e defini -lo uma função não reflete em outra função ??
Solução
__init__
é necessário para retornar nenhum. Você não pode (ou pelo menos não deveria) devolver outra coisa.
Tente fazer o que quiser retornar uma variável de instância (ou função).
>>> 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
Outras dicas
Por que você gostaria de fazer isso?
Se você quiser devolver algum outro objeto quando uma classe é chamada, use o __new__()
método:
class MyClass(object):
def __init__(self):
print "never called in this case"
def __new__(cls):
return 42
obj = MyClass()
print obj
Como uma restrição especial aos construtores, nenhum valor pode ser retornado; Fazer isso fará com que um TypeError seja criado em tempo de execução.
Como prova, este código:
class Foo(object):
def __init__(self):
return 2
f = Foo()
Dá este erro:
Traceback (most recent call last):
File "test_init.py", line 5, in <module>
f = Foo()
TypeError: __init__() should return None, not 'int'
A amostra de uso do assunto em questão pode ser como:
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)
Eu não tenho reputação suficiente para não escrever um comentário, é loucura! Eu gostaria de poder postar como um comentário para Weronika
o __init__
O método, como outros métodos e funções, retorna nenhum por padrão na ausência de uma declaração de devolução, para que você possa escrevê -lo como qualquer um deles:
class Foo:
def __init__(self):
self.value=42
class Bar:
def __init__(self):
self.value=42
return None
Mas, claro, adicionando o return None
Não compra nada para você.
Não tenho certeza do que você procura, mas você pode estar interessado em um desses:
class Foo:
def __init__(self):
self.value=42
def __str__(self):
return str(self.value)
f=Foo()
print f.value
print f
impressões:
42
42
__init__
não retorna nada e sempre deve retornar None
.
Só queria acrescentar, você pode devolver as aulas em __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
O método acima ajuda a implementar uma ação específica após uma exceção em seu teste
Você pode simplesmente defini -lo como uma variável de classe e lê -la no programa principal:
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
Bem, se você não se importa mais com a instância do objeto ... você pode apenas substituí -lo!
class MuaHaHa():
def __init__(self, ret):
self=ret
print MuaHaHa('foo')=='foo'