__metaclass__
クラスのプロパティと実際の継承の間で多くの混乱があり__new__
、これらのシナリオのいずれかでどのように呼び出されるか。私の問題は、django フレームワークのいくつかのモデル コードを掘り下げることから来ています。
Meta
子のサブクラスで定義されているように、クラスに属性を追加したいとしましょう。
class Parent(type):
def __new__(cls, name, base, attrs):
meta = attrs.pop('Meta', None)
new_class = super(Parent, cls).__new__(cls, name, base, attrs)
new_class.fun = getattr(meta, 'funtime', None)
return new_class
django のコードで実際のメソッドが呼び出される理由がわかりませんが、__new__
そのようなコードを作成しようとすると機能しません。
私が経験したことから、以下は実際__new__
には親のメソッドを呼び出しません:
class Child(Parent):
class Meta:
funtime = 'yaaay'
C = Child()
これをやろうとすると、TypeError で文句を言います:
TypeError: __new__() takes exactly 4 arguments (1 given)
しかし、私が見てきたソース コードは、そのように動作するようです。
メタクラスで実行できることを理解しています:
class Child(object):
__metaclass__ = Parent
__metaclass___
しかし、配布可能なモジュールを作成する場合は非の方がクリーンになるため、なぜ彼らの方法が私ではなく彼らにとって機能するのかわかりません。
誰かが私が欠けているものについて正しい方向に向けてくれませんか?
ありがとう!