如何在 Python 中返回__ init__ 的值?

我有一个具有 __init__函数的类。

在创建对象时,如何从该函数返回一个整数值?

我写了一个程序,其中 __init__执行命令行解析,我需要设置一些值。是否可以在全局变量中设置它,并在其他成员函数中使用它?如果是这样,如何做到这一点?到目前为止,我在类之外声明了一个变量。并且设置它一个函数不反映在其他函数中? ?

213062 次浏览

__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

__init__不返回任何内容,应该始终返回 None

来自 文件:

作为构造函数的特殊约束,不能返回任何值; 这样做将导致在运行时引发 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'

你为什么要这么做?

如果你想在调用一个类的时候返回一些其他的对象,那么使用 __new__()方法:

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


obj = MyClass()
print obj

与其他方法和函数一样,__init__方法在没有 return 语句的情况下默认返回 Nothing,所以你可以这样写:

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

这个问题的用法可以是这样的:

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)

只是想添加,您可以返回 __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

上面的方法可以帮助您在测试中对异常实现特定的操作

好吧,如果你不再关心对象实例了... 你可以直接替换它!

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


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

你只需要将它设置为一个 class 变量,然后从主程序中读取它:

class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode

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公里

解决方案 是的, 尝试从 python 中的 Init方法返回返回错误,因为它是类的构造函数,您只能为类的作用域分配值,但不能返回特定的值。 如果希望返回值但不希望创建方法,可以使用 Str 方法

def __init__(self,a):
self.value=a


def __str__(self):
return str("all my return values are possible here")`

我们不能从 init 返回值,但是我们可以使用 新的返回值。

class Car:
def __new__(cls, speed, unit):
return (f"{speed} with unit {unit}")




car = Car(42, "km")
print(car)

当试图将一些字符串数据解析为递归数据结构时遇到了这种情况,并且有一个计数器要传递。

Python 不允许从 __init__返回任何东西,但是您可以编写一个工厂函数,或者一个类方法,或者一个 Parser类,这取决于代码结构和解析的复杂性,解析将您的数据解析为数据对象。

全局变量不是一个好的解决方案,因为它可能在其他地方被更改,从而破坏解析逻辑。

功能示例:

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)