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

web*_*org 88 python class init

我有一个__init__功能的类.

如何在创建对象时从此函数返回整数值?

我写了一个程序,__init__命令行解析在哪里,我需要设置一些值.可以在全局变量中设置它并在其他成员函数中使用它吗?如果是这样怎么办?到目前为止,我在课外宣布了一个变量.并设置一个功能不反映在其他功能??

Jac*_*zny 107

你为什么想这么做?

如果要在调用类时返回其他对象,请使用以下__new__()方法:

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

obj = MyClass()
print obj
Run Code Online (Sandbox Code Playgroud)

  • @weronika一个想法:在你通常使用工厂的任何情况下,但你有理由想要提供一个看起来像普通类实例化的界面.示例:在您的类的`__init__`中添加一些新的可选参数时,您会意识到,为了提供您想要的灵活性,您需要一个返回专用子类实例的类工厂.但是您图书馆的用户已经在使用您现有的API.要保留它,可以覆盖`__new__`以返回专用子类的实例. (30认同)
  • 是的,__ new__是在使用类时返回类实例以外的其他东西的正确方法......我只是想知道 - 你有没有理由想要这样做? (9认同)
  • 如果您想查看Mark Amery所说的示例,请查看标准库中`datetime`模块的源代码.它以这种方式使用`__new__`. (8认同)

Can*_*der 103

__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
Run Code Online (Sandbox Code Playgroud)

  • __init__不返回新创建的对象 - 如TypeError中所示,它需要返回None,对吗?__new__返回新创建的对象,__ init__只是设置了一些属性.但是,正如你所说,改变__init__或__new__,返回其他东西真的没有意义. (69认同)
  • +1:你**不能**返回别的东西.它没有任何意义. (18认同)
  • 仅仅因为它不能完成并不意味着它就没有意义。例如,将数据从`super().__ init__`传递到派生类将是很好的,而不必通过实例变量进行中继。 (2认同)

nos*_*klo 37

来自以下文件__init__:

作为构造函数的特殊约束,不能返回任何值; 这样做会导致在运行时引发TypeError.

作为证明,这段代码:

class Foo(object):
    def __init__(self):
        return 2

f = Foo()
Run Code Online (Sandbox Code Playgroud)

给出了这个错误:

Traceback (most recent call last):
  File "test_init.py", line 5, in <module>
    f = Foo()
TypeError: __init__() should return None, not 'int'
Run Code Online (Sandbox Code Playgroud)


PMN*_*PMN 16

样本使用的问题可能如下:

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)
Run Code Online (Sandbox Code Playgroud)

我没有足够的声誉所以我不能发表评论,这太疯狂了!我希望我能把它作为对weronika的评论发表

  • 这将引发NameError:`self`未在`__new __(cls,Item)`中定义 (3认同)

qua*_*ana 13

__init__在缺少return语句的情况下,该方法与其他方法和函数一样,默认情况下返回None,因此您可以像以下任一方式一样编写它:

class Foo:
    def __init__(self):
        self.value=42

class Bar:
    def __init__(self):
        self.value=42
        return None
Run Code Online (Sandbox Code Playgroud)

但是,当然,添加return None不会给你带来什么.

我不确定你在追求什么,但你可能对以下其中一个感兴趣:

class Foo:
    def __init__(self):
        self.value=42
    def __str__(self):
        return str(self.value)

f=Foo()
print f.value
print f
Run Code Online (Sandbox Code Playgroud)

打印:

42
42
Run Code Online (Sandbox Code Playgroud)


gru*_*czy 8

__init__不返回任何东西,应该总是返回None.


Pyt*_*Pro 5

您可以将其设置为类变量并从主程序中读取它:

class Foo:
    def __init__(self):
        #Do your stuff here
        self.returncode = 42
bar = Foo()
baz = bar.returncode
Run Code Online (Sandbox Code Playgroud)