2017-07-27 10 views
0

私はcls().__init__()がクラスメソッドで使われているのを見ましたが、代わりに単純なcls()を使用しているようです。以下のように:クラスメソッドや他の場所でコードcls().__ init __()を使用していますか?

class SomeCrazyClass: 

    @classmethod 
    def newclass(cls): 
     return cls().__init__() 

    @classmethod 
    def newclass2(cls): 
     return cls() 

これはただの貧しいコーディングスタイルの選択をするか、いくつかの状況でcls().__init__()の実用化はありますか?

+0

いいえ、ちょうどSomeCrazyClassにあります。投稿が更新されました。 – ChrisFreeman

+2

あなたはこれを見ましたか?これは、基本的にインスタンス上で '__init__'を2回呼び出します。 –

+0

'__init__'は通常何も返さないので、' newclass'は特に有用ではありません。 – chepner

答えて

1

cls().__init__()cls()の違いは、前者コールがインスタンスに__init__二度、したがってNoneを返し、後者は実際のインスタンスを返すことです。

しかし、__init__を呼び出す想像上のシナリオは、クラスの遅延初期化で使用することもできますし、他のユースケースでもかまいません。インスタンス変数は、属性の最初のアクセス時にのみロードされている以下のコードでたとえば

def init(cls, real_init): 
    def wrapped(self, *args, **kwargs): 
     cls.__init__ = real_init 
    return wrapped 


class A(object): 
    def __new__(cls, *args, **kwargs): 
     cls.__init__ = init(cls, cls.__init__) 
     instance = object.__new__(cls) 
     return instance 

    def __getattr__(self, attr): 
     expected_attrs = ('a', 'b') 
     if attr in expected_attrs: 
      self.__init__(range(10000), range(1000)) 
     return object.__getattribute__(self, attr) 

    def __init__(self, a, b): 
     print('inside __init__') 
     self.a = sum(a) 
     self.b = sum(b) 

デモ:私たちは、今からも値を返すことができ

>>> a = A() 
>>> a.__dict__ 
{} 
>>> a.a, a.b 
inside __init__ 
(49995000, 499500) 
>>> a.__dict__ 
{'a': 49995000, 'b': 499500} 

>>> a = A()  
>>> a.__init__(range(10**5), range(10**4)) 
inside __init__  
>>> a.a, a.b 
(4999950000, 49995000) 

__init__現在は通常不可能です。

関連する問題