、心の中でそれを保管してください。
しかし、クラスをインスタンス化すると、構文は と同じようになります。メソッド呼び出し - クラスオブジェクト名の後ろに括弧が続く - クラス自体(Pythonオブジェクト)が呼び出されます。 - 呼び出し可能オブジェクトとして。
Pythonでオブジェクトを呼び出すと、クラス内で__call__
というマジックメソッドが呼び出されます。したがって、クラスをインスタンス化すると、そのメタクラスで__call__
メソッドが呼び出されます。あなたが__call__
をオーバーライドし、メタクラスを書き、中__init__
への呼び出しを抑制する場合は、だから、
def __call__(cls, *args, **kw):
self = cls.__new__(cls, *args, **kw)
cls.__init__(self, *args, **kw)
return self
:何(「タイプ」である)標準メタクラスでこの__call__
メソッド内であることとほぼ同等です
これらは、すべての時に呼び出されることはありません。
class Meta(type):
def __call__(cls, *args, **kw):
return cls.__new__(cls, *args, **kw)
class NoInit(object):
__metaclass__ = Meta
def __init__(self):
print "Hello!"
NoInit()
あなただけsublcassesが__init__
代わりにそれを呼び出していないの、あなたがはるかに簡単メタクラスのと同じRAISを行うことができます持っていることを回避したい場合クラスインスタンス化時の例外:
class Meta(type):
def __new__(metacls, name, bases, dct):
if "__init__" in dct:
raise NameError("Classes in this hierarchy should not have an __init__ method")
return type.__new__(metacls, name, bases, dct)
「「__init__メソッド」をオーバーライドしないでください。ユーザーを信頼してください。また、スマートユーザは 'super'を使う方法を知っているでしょう – JBernardo
私はf ***に' __init__'を使う必要がないと思っています。クラスは 'state_entry()'が呼び出されたかどうかを追跡し、それまでは何でも。 – wim
これは参考になるものですが、技術的に可能であれば興味があります。私がそれをするべきかどうかは別々の議論です。:) –