私は__prepare__
機能について教えています。 result.member_names = classdict.member_names
メタクラスと__prepare__()
どの変数classdict
がmember_table
クラスから属性を取得できます?そして、私は私の質問は、このラインであるPEP3115
# The custom dictionary
class member_table(dict):
def __init__(self):
self.member_names = []
def __setitem__(self, key, value):
# if the key is not already defined, add to the
# list of keys.
if key not in self:
self.member_names.append(key)
# Call superclass
dict.__setitem__(self, key, value)
# The metaclass
class OrderedClass(type):
# The prepare function
@classmethod
def __prepare__(metacls, name, bases): # No keywords in this case
return member_table()
# The metaclass invocation
def __new__(cls, name, bases, classdict):
# Note that we replace the classdict with a regular
# dict before passing it to the superclass, so that we
# don't continue to record member names after the class
# has been created.
result = type.__new__(cls, name, bases, dict(classdict))
result.member_names = classdict.member_names
return result
class MyClass(metaclass=OrderedClass):
# method1 goes in array element 0
def method1(self):
pass
# method2 goes in array element 1
def method2(self):
pass
でこのスニペットを参照してください__prepare__
関数はmember_tableのインスタンスを返しますが、member_table()
とclassdict.member_names
の間のリンクはどのように生成されますか?
多くの皆様に感謝します。
あなたの答えをありがとう!もう少し小さな疑問 - '__prepare__'関数が常にdictまたは修飾dict型(他の型ではない)である名前空間を返すことを確認できますか? – luoshao23
「確認する」とはどういう意味ですか?あなたは '__prepare__'をオーサリングし、それが何を返すのか知っているべきです。完全なマッピングオブジェクトのように動作する必要がない場合は、 '__setitem__'だけが必要で、mclass' __init__'のコードはそれに対処する方法を知っています。 – jsbueno
(あなたの質問に答えられた場合は、その答えを忘れないでください) – jsbueno