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__
現在は通常不可能です。
いいえ、ちょうどSomeCrazyClassにあります。投稿が更新されました。 – ChrisFreeman
あなたはこれを見ましたか?これは、基本的にインスタンス上で '__init__'を2回呼び出します。 –
'__init__'は通常何も返さないので、' newclass'は特に有用ではありません。 – chepner