2016-07-25 9 views
1

私は初期化と同じクラスのインスタンスを受け入れるクラスを持っています。そのような場合、単にそのインスタンスを返すだけです。同じクラスのifクラスの初期化値を返す最善のpythonメソッド

私は、このクラスに無数の初期化値を受け入れ、その後、進行コードがこれを初期化の仕方に依存しない既知のプロパティを持つオブジェクトとして使用できるようにするためです。

私のような何かを考えている:問題は、私は、このように初期化されたときに__init__()が呼ばれるようにしたくないということです

class c(object): 
    def __new__(cls, *args, **kwargs): 
    if isinstance(args[0], c): 
     return args[0] 
    else: 
     return super(c, cls).__new__(cls, *args, **kwargs) 

。他の方法はありますか?

ありがとうございます!

+0

'__init __()'を呼びたくないのはなぜですか? '__init __()'が呼び出されても何もしなかったらOKでしょうか? –

+0

args [0]がクラス – Pato

+0

でない場合にのみ '__init __()'を呼び出す必要があります。しかし、私はあなたに尋ねています:なぜそれは重要ですか?あなたは電話を避けることがどれくらい重要ですか?インスタンスで初期化するときには何もしないようにするか、他の値で初期化するときには何もしないようにすることができます。 –

答えて

1

詳細については、question(英語)を参照してください。 それとも、あなたが何をしたいのクラスのメソッドを使用し、FE:

class C(object): 
    @classmethod 
    def new(cls, *args, **kwargs): 
     if isinstance(args[0], cls): 
      return args[0] 
     else: 
      return cls(*args, **kwargs) 

obj = C.new() 
obj2 = C.new(obj) 
1

あなたはのは

In [3]: instance1 = Test(0) 
In [4]: instance2 = Test(instance1) 
In [5]: print id(instance1) == id(instance2) 
Out[5]: True 

IDが両方のため、同一であり、それをテストしてみましょうメタクラス

class InstanceReturnMeta(type): # You should probably think of a better name 
    def __call__(cls, *args, **kwargs): 
     if args and isinstance(args[0], cls): 
      return args[0] 
     instance = cls.__new__(cls, *args, **kwargs) 
     instance.__init__(*args, **kwargs) 
     return instance 


class Test(object): 
    __metaclass__ = InstanceReturnMeta 
    def __init__(self, value): 
     self.value = value 

を使用することができます変数は同じインスタンスを参照します。

P.S.あなたのクラスは明示的にobjectから継承しているので、私はあなたがPython 2であると仮定します。

1

標準的な方法は、__init__で初期化を行わないことです。 __new__で行います。

関連する問題