Как вернуть значение из __init__ в Python? - PullRequest
86 голосов
/ 22 марта 2010

У меня есть класс с функцией __init__.

Как я могу вернуть целочисленное значение из этой функции при создании объекта?

Я написал программу, где __init__ выполняет синтаксический анализ командной строки, и мне нужно установить какое-то значение. Можно ли установить его в глобальную переменную и использовать в других функциях-членах? Если так, то как это сделать? До сих пор я объявил переменную вне класса. и установка одной функции не отражается в другой функции ??

Ответы [ 9 ]

102 голосов
/ 22 марта 2010

Зачем вам это нужно?

Если вы хотите вернуть другой объект при вызове класса, используйте метод __new__():

class MyClass(object):
    def __init__(self):
        print "never called in this case"
    def __new__(cls):
        return 42

obj = MyClass()
print obj
96 голосов
/ 22 марта 2010

__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
37 голосов
/ 22 марта 2010

Из документации __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'
13 голосов
/ 07 июля 2013

Пример использования рассматриваемого вопроса может быть как:

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)

Мне не хватает репутации, поэтому я не могу написать комментарий, это безумие! Хотелось бы опубликовать это как комментарий к weronika

13 голосов
/ 22 марта 2010

Метод __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
8 голосов
/ 22 марта 2010

__init__ ничего не возвращает и всегда должно возвращать None.

2 голосов
/ 02 июня 2016

Просто хотел добавить, вы можете вернуть классы в __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

Приведенный выше метод помогает вам выполнить определенное действие после исключения в вашем тесте

0 голосов
/ 12 января 2019

Вы можете просто установить переменную класса и прочитать ее из основной программы:

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode
0 голосов
/ 04 сентября 2018

Хорошо, если вам больше не нужен экземпляр объекта ... вы можете просто заменить его!

class MuaHaHa():
def __init__(self, ret):
    self=ret

print MuaHaHa('foo')=='foo'
...