如何从 Python 中的 __init__ 返回一个值?

2025-03-05 09:14:00
admin
原创
44
摘要:问题描述:我有一个具有__init__功能的类。当创建一个对象时,如何从该函数返回一个整数值?我写了一个程序,__init__命令行解析在哪里,我需要设置一些值。可以将其设置为全局变量并在其他成员函数中使用它吗?如果可以,该怎么做?到目前为止,我在类外声明了一个变量。在一个函数中设置它不会反映在其他函数中?解...

问题描述:

我有一个具有__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'
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1914  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1432  
  项目管理专业人士(PMP)认证是许多从业者职业发展的重要里程碑,但备考过程中难免会遇到时间冲突的问题。工作安排、家庭责任或其他突发事件可能会打乱原定的复习计划,甚至影响考试当天的状态。面对这种情况,能否高效调整策略、化解冲突,直接关系到考试成败。提前掌握应对技巧并制定灵活的预案,可以帮助考生在压力下保持冷静,最大化利用...
深入浅出PMP   0  
  项目管理证书早已不再是少数专业人士的专属标签,而是逐渐成为职场竞争力的通用货币。无论是希望晋升的管理者,还是渴望转型的从业者,系统化的项目管理知识体系都能为职业发展提供清晰路径。这种认证的价值不仅体现在理论知识的沉淀上,更在于它能将碎片化的实践经验转化为可复用的方法论,从而帮助持证者在复杂工作场景中快速找到最优解。随着...
pmp怎么考   0  
  项目管理专业人士(PMP)认证是全球公认的项目管理领域黄金标准,它不仅能够提升个人职业竞争力,还能为组织带来更高的项目管理成熟度。然而,PMP考试的通过率并不高,许多考生在备考过程中面临巨大挑战。通过分析大量成功案例和失败教训,我们发现提升PMP考试通过率的关键在于系统化的备考策略和高效的执行方法。以下是七个关键因素,...
PMP证书怎么考   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用