Как вернуть значение из __init__ в Python?
У меня есть класс с __init__
функция.
Как я могу вернуть целочисленное значение из этой функции при создании объекта?
Я написал программу, где __init__
выполняет синтаксический анализ командной строки, и мне нужно установить некоторое значение. Можно ли установить его в глобальной переменной и использовать в других функциях-членах? Если так, то как это сделать? До сих пор я объявил переменную вне класса. и установка одной функции не отражается в другой функции??
13 ответов
__init__
Требуется вернуть Нет. Вы не можете (или, по крайней мере, не должны) возвращать что-то еще.
Попробуйте сделать все, что хотите, чтобы вернуть переменную экземпляра (или функцию).
>>> 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
Почему вы хотите это сделать?
Если вы хотите вернуть какой-то другой объект при вызове класса, используйте __new__()
метод:
class MyClass(object):
def __init__(self):
print "never called in this case"
def __new__(cls):
return 42
obj = MyClass()
print obj
Из документации __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'
Пример использования рассматриваемого вопроса может быть таким:
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
__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
__init__
ничего не возвращает и всегда должен возвращать None
,
Вы можете просто установить переменную класса и прочитать ее из основной программы:
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
Мы не можем вернуть значение из init. Но мы можем вернуть значение с помощью new.
class Car:
def __new__(cls, speed, unit):
return (f"{speed} with unit {unit}")
car = Car(42, "km")
print(car)
init() не возвращает никакого значения, решено идеально
class Solve:
def __init__(self,w,d):
self.value=w
self.unit=d
def __str__(self):
return str("my speed is "+str(self.value)+" "+str(self.unit))
ob=Solve(21,'kmh')
print (ob)
вывод: моя скорость 21 кмч
Просто хотел добавить, вы можете вернуть классы в __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
Вышеуказанный метод помогает вам выполнить определенное действие после исключения в вашем тесте.
Встретил этот случай, когда попытался разобрать некоторые строковые данные в рекурсивную структуру данных, и нужно было передать счетчик.
Python не позволяет ничего возвращать из__init__
, но вы можете написать фабричную функцию, или метод класса, илиParser
class, в зависимости от структуры кода и сложности разбора, который будет разбирать ваши данные на объекты данных.
Глобальная переменная — не лучшее решение, так как ее можно изменить где-то еще, нарушив логику парсинга.
Пример функции:
class MyClass():
def __init__(self, a, b, c):
# only assignments here
self.a = a
self.b = b
self.c = c
# return None
def parse(data):
# parsing here
a = ...
b = ...
c = ...
# status, counter, etc.
i = ...
# create an object
my_obj = MyClass(a, b, c)
# return both
return my_obj, i
# get data and parse
data = ...
my_obj, i = parse(data)
Пример метода класса:
class MyClass():
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
@classmethod
def parse(cls, data):
a = ...
b = ...
c = ...
i = ...
obj = cls(a, b, c)
return obj, i
data = ...
my_obj, i = MyClass.parse(data)
Что ж, если вам больше не нужен экземпляр объекта... вы можете просто заменить его!
class MuaHaHa():
def __init__(self, ret):
self=ret
print MuaHaHa('foo')=='foo'
решение здесь Да, попытка возврата из метода инициализации в python возвращает ошибки, поскольку это конструктор класса, вы можете назначать значения только для области действия класса, но не возвращать конкретное значение. если вы хотите вернуть значение, но не хотите создавать метод, вы можете использовать метод str
def __init__(self,a):
self.value=a
def __str__(self):
return str("all my return values are possible here")`