__init__
関数を持つクラスがあります。
オブジェクトの作成時にこの関数から整数値を返すにはどうすればよいですか?
__init__
がコマンドライン解析を行うプログラムを作成し、値を設定する必要があります。グローバル変数に設定して他のメンバー関数で使用しても大丈夫ですか?もしそうならそれを行う方法?これまでのところ、クラス外で変数を宣言しました。そして、それを1つの機能に設定すると、他の機能に反映されません??
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
なぜあなたはそれをしたいのですか?
クラスが呼び出されたときに他のオブジェクトを返す場合は、__new__()
メソッドを使用します。
class MyClass(object):
def __init__(self):
print "never called in this case"
def __new__(cls):
return 42
obj = MyClass()
print obj
__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'
問題の問題の使用例は次のようになります。
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へのコメントとして投稿できるといいのですが
__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
__init__
は何も返さず、常にNone
を返す必要があります。
追加したいだけで、__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
上記のメソッドは、テストの例外時に特定のアクションを実装するのに役立ちます
クラス変数に設定するだけで、メインプログラムから読み取ることができます。
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode