Как вернуть значение из __init__ в Python?
У меня есть класс с функцией __init__
.
Как вернуть целочисленное значение из этой функции при создании объекта?
Я написал программу, где __init__
выполняет синтаксический анализ командной строки, и мне нужно установить определенное значение. Можно ли установить его в глобальной переменной и использовать его в других функциях-членах? Если да, то как это сделать? До сих пор я объявлял переменную вне класса. и установка его одной функции не отражается в другой функции?
Ответы
Ответ 1
__init__
требуется вернуть None. Вы не можете (или, по крайней мере, не должны) возвращать что-то еще.
Попробуйте сделать все, что хотите, чтобы вернуть переменную экземпляра (или функцию).
>>> 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
Ответ 2
Зачем вам это нужно?
Если вы хотите вернуть какой-либо другой объект при вызове класса, используйте метод __new__()
:
class MyClass(object):
def __init__(self):
print "never called in this case"
def __new__(cls):
return 42
obj = MyClass()
print obj
Ответ 3
Из документации __init__
:
В качестве специального ограничения для конструкторов никакое значение не может быть возвращено; это приведет к тому, что TypeError будет поднят во время выполнения.
В качестве доказательства этот код:
class Foo(object):
def __init__(self):
return 2
f = Foo()
Дает эту ошибку:
Traceback (most recent call last):
File "test_init.py", line 5, in <module>
f = Foo()
TypeError: __init__() should return None, not 'int'
Ответ 4
Пример. Использование рассматриваемого вопроса может быть следующим:
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)
У меня недостаточно репутации, поэтому я не могу написать комментарий, это сумасшествие! Я хотел бы опубликовать его в качестве комментария к weronika
Ответ 5
Метод __init__
, как и другие методы и функции, возвращает None по умолчанию в отсутствие оператора return, поэтому вы можете записать его как любой из следующих:
class Foo:
def __init__(self):
self.value=42
class Bar:
def __init__(self):
self.value=42
return None
Но, конечно, добавление return None
ничего не покупает.
Я не уверен, что вам нужно, но вы можете быть заинтересованы в одном из них:
class Foo:
def __init__(self):
self.value=42
def __str__(self):
return str(self.value)
f=Foo()
print f.value
print f
печатает:
42
42
Ответ 6
__init__
ничего не возвращает и всегда должен возвращать None
.
Ответ 7
Просто хотел добавить, вы можете возвращать классы в __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
Вышеупомянутый метод помогает вам выполнить определенное действие над Исключением в вашем тесте
Ответ 8
Вы можете просто установить переменную класса и прочитать ее из основной программы:
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
Ответ 9
Что ж, если вам больше не нужен экземпляр объекта... вы можете просто заменить его!
class MuaHaHa():
def __init__(self, ret):
self=ret
print MuaHaHa('foo')=='foo'