Как вернуть значение из __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__, но вы можете написать фабричную функцию, или метод класса, илиParserclass, в зависимости от структуры кода и сложности разбора, который будет разбирать ваши данные на объекты данных.

Глобальная переменная — не лучшее решение, так как ее можно изменить где-то еще, нарушив логику парсинга.

Пример функции:

      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")`
Другие вопросы по тегам