如何从 Python 中的 __init__ 返回一个值?
- 2025-03-05 09:14:00
- admin 原创
- 44
问题描述:
我有一个具有__init__
功能的类。
当创建一个对象时,如何从该函数返回一个整数值?
我写了一个程序,__init__
命令行解析在哪里,我需要设置一些值。可以将其设置为全局变量并在其他成员函数中使用它吗?如果可以,该怎么做?到目前为止,我在类外声明了一个变量。在一个函数中设置它不会反映在其他函数中?
解决方案 1:
如果您想在调用类时返回其他对象,则使用该__new__()
方法:
class MyClass:
def __init__(self):
print("never called in this case")
def __new__(cls):
return 42
obj = MyClass()
print(obj)
# Output: 42
解决方案 2:
__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
解决方案 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 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)
解决方案 5:
该__init__
方法与其他方法和函数一样,如果没有 return 语句,则默认返回 None ,因此您可以像以下任一方式编写它:
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:
您可以将其设置为类变量并从主程序中读取它:
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
解决方案 8:
我们不能从 init 返回值。但我们可以使用new返回值。
class Car:
def __new__(cls, speed, unit):
return (f"{speed} with unit {unit}")
car = Car(42, "km")
print(car)
解决方案 9:
init () 返回 none 值 完美解决
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 公里/小时
解决方案 10:
只是想补充一下,你可以返回课程__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
上述方法可帮助您在测试中针对异常执行特定操作
解决方案 11:
当尝试将一些字符串数据解析为递归数据结构并需要传递计数器时遇到了这种情况。
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)
解决方案 12:
正如其他答案中提到的,使用__new__
是最好的选择。
只是添加一个用例来说明原因。我工作的公司要求我将我们的内部系统从 Python 3.8 更新到 3.10 Flask
,而我们仍在使用 1.xx 版本,因此我更新到了 2.xx,这最初导致将 SQLAlchemy 升级到版本 2,但这造成了使用db.engine.execute()
调用方面的不兼容问题,这些问题仍然存在。
为了解决这个问题,我首先尝试了一个包装函数,用正确的基于上下文的引擎调用替换这些调用,但对于如下调用,这不起作用:
db.engine.execute(sql).scalar()
因为函数不能有自己的成员函数。因此,解决方案是创建一个可以使用两种形式调用的类:
DBEngineClass(sql)
和
DBEngineClass(sql).scalar()
其中定义DBEngineClass
了__new__
成员函数来返回来自引擎调用的纯函数ResultProxy
,而还有一个scalar()
和fetchall()
成员函数依赖于__init__
成员函数来执行 sql 查询,然后将result
成员变量设置为ResultProxy
,然后可以由scalar()
和fetchall()
成员函数对其进行变异和返回。
这样,我们就可以通过简单地在受影响的 python 文件中添加新的导入语句,然后进行简单的查找和替换来减少重构所需花费的总体时间,以保持相同的功能,并使系统与较新版本的兼容SQLAlchemy
。
谢谢阅读 :-)
解决方案 13:
解决方案在这里是的,尝试从 python 中的init方法
返回会返回错误,因为它是类的构造函数,您只能为类的范围分配值,但不能返回特定值。如果您想返回一个值但不想创建方法,则可以使用
str方法
def __init__(self,a):
self.value=a
def __str__(self):
return str("all my return values are possible here")`
解决方案 14:
好吧,如果您不再关心对象实例……您可以直接替换它!
class MuaHaHa():
def __init__(self, ret):
self=ret
print MuaHaHa('foo')=='foo'