2011-10-28 11 views
1

()メソッドをクラスの1回だけ呼び出す方法はありますか?または、クラスからオブジェクトを作成するときに、()の呼び出しを無効にするにはどうすればよいですか?Pythonは__init __()メソッドを1回だけ呼び出します

+0

シングルトンが必要なのですか? –

+5

'__init__'は常にオブジェクト構築時に呼び出されます。それがそこにあるのです。それを一度だけ呼び出そうとするなら、あなたのロジックに欠陥がある可能性があります。あなたが達成しようとしているものを投稿すると、より正確な解決策を見つけるのを助けることができるかもしれません。 –

+0

'__init__'の目的は、クラスのインスタンスを作成するときに発生することです。あなたがここで何をしようとしているのかについてもっと具体的にしてください。 – Will

答えて

7

あなたはクラスのしかつのインスタンスがPEP18から得て、あなたは、次のようなデコレータを作成することができますがありシングルトン、場合:

def singleton(cls): 
    instances = {} 
    def getinstance(): 
     if cls not in instances: 
      instances[cls] = cls() 
     return instances[cls] 
    return getinstance 

@singleton 
class MyClass: 
    pass 

はそれを試してみてください:

>>> a = MyClass() 
>>> b = MyClass() 
>>> a == b 
True 
0

initメソッドは常に呼び出されますが、オプションでオブジェクトの作成後に呼び出すrun()などの別のメソッドを作成することもできます。

foo = ClassName() 
foo.run() # replacement for __init__ 

foo2 = ClassName() 
2

__init__を無効にする直接的な方法はありませんが、これを回避するには、いくつかの方法があります。そのうちの1人が旗を掲げています:

class Class: 
    _init_already = False 
    __init__(self): 
     if not Class._init_already: 
      ... 
      Class._init_already = True 

これは醜いです。本当に達成しようとしていることは何ですか?

1

__init__()には、一度だけ実行したいものを入れないでください。クラスのインスタンスを作成するたびに__init__()が実行されます。

クラスの作成をカスタマイズする場合は、metaclassを作成する必要があります。基本的には、クラスを最初に定義したときに一度だけ実行される関数を定義できます。

関連する問題