Как вернуть значение из __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'