web-dev-qa-db-ja.com

Pythonで__init__から値を返す方法は?

__init__関数を持つクラスがあります。

オブジェクトの作成時にこの関数から整数値を返すにはどうすればよいですか?

__init__がコマンドライン解析を行うプログラムを作成し、値を設定する必要があります。グローバル変数に設定して他のメンバー関数で使用しても大丈夫ですか?もしそうならそれを行う方法?これまでのところ、クラス外で変数を宣言しました。そして、それを1つの機能に設定すると、他の機能に反映されません??

86
webminal.org

Noneを返すには__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
99
Can Berk Güder

なぜあなたはそれをしたいのですか?

クラスが呼び出されたときに他のオブジェクトを返す場合は、__new__()メソッドを使用します。

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

obj = MyClass()
print obj
104
Jacek Konieczny

__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'
37
nosklo

問題の問題の使用例は次のようになります。

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)

評判が足りないのでコメントを書くことができません。 weronikaへのコメントとして投稿できるといいのですが

14
PMN

__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
13
quamrana

__init__は何も返さず、常にNoneを返す必要があります。

8
gruszczy

追加したいだけで、__init__でクラスを返すことができます

@property
def failureException(self):
    class MyCustomException(AssertionError):
        def __init__(self_, *args, **kwargs):
            *** Your code here ***
            return super().__init__(*args, **kwargs)

    MyCustomException.__= AssertionError.__name__
    return MyCustomException

上記のメソッドは、テストの例外時に特定のアクションを実装するのに役立ちます

2
Eugene Nosenko

クラス変数に設定するだけで、メインプログラムから読み取ることができます。

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