6

余談スタート

Pythonのメタクラスとは何かを学びました。Pythonの作成者は、誰もがPythonを使用することを望んでいたとは思いません。つまり、ほとんどの場合クラスではない可能性のあるメタクラスに名前を付けるだけで、ほとんどの人をこの概念からそらすことができます。

余談終了

私の質問に移ります。この単純なメタクラスを作成して、モジュールで作成されるすべてのクラスにデフォルトのドキュメント文字列を追加しました。しかし、それは機能していません:

def metest(cls,name,bases,dict):
    cls.setattr(cls,'__doc__',"""Default Doc""")
    return type(cls,(),{})

__metaclass__=metest

class test(object):
    pass

print test.__doc__

t=test()

print t.__doc__

出力:

None
None

私は何が間違っているのですか?

4

5 に答える 5

4

私はあなたが行っているグローバルなアプローチに完全には精通しておらず、__metaclass__そのように設定しています。私が知っている限りでは、それは別の有効なスタイルです。

しかし、私が精通していることの例を提供します。

class MeTest(type):
    def __new__(cls,name,bases,dict):
        dict['__doc__'] = """Default Doc"""
        return type.__new__(cls,name,bases,dict)

class Test(object):
    __metaclass__ = MeTest
于 2012-06-29T05:23:42.653 に答える
3

私はあなたの例を機能させました:

def metest(name, bases, dict):
    print name, bases, dict
    dict['__doc__'] = """New Doc"""
    cls = type(name+"_meta", bases, dict)
    return cls

class Test(object):
    "Old doc"
    __metaclass__ = metest

print Test
print Test.__doc__

t = Test()

print t.__doc__
  1. 「メタクラス」を使用させます。
  2. 「クラス作成関数」のシグネチャを修正してください。はcls私たちによって作成されます。
  3. 区別するために、「古い」と「新しい」docstringを用意します。
于 2012-06-29T06:06:29.047 に答える
2

この回答を参照してください:Pythonメタクラスとオブジェクト基本クラス

基本クラスを指定すると、モジュールレベルのメタクラスがオーバーライドされ、 (のメタクラス)objectに置き換えられます。typeobject

__metaclass__さらに、メタクラスに障害があり、(クラス内で設定して)適用しても機能しません。3つの引数のみを受け入れる必要があります。通常、4つを受け入れる例が表示されますが、これは、メタクラスが通常、クラスであると推測されるため、追加の「自己」引数(慣例によりclsメタクラスと呼ばれます)を受け入れるためです。

于 2012-06-29T05:13:05.113 に答える
1

おそらくこれはあなたが望むものです。から継承objectするとメタクラスが作成typeされるため、グローバルメタクラスを使用する場合はそれを実行できません。

def metest(name, bases, dct):
    dct['__doc__'] = """Default Doc"""
    return type(name, bases, dct)

__metaclass__=metest

class test:
    pass

print test.__doc__

t=test()

print t.__doc__
于 2012-06-29T07:01:40.853 に答える
1

BrenBarnが前述したように、モジュールレベルのメタクラスはオーバーライドされます。これを修正するには、クラスインスタンスとして設定するのではなく、clsを返すようにコーディングしてみてください。

于 2016-03-31T07:09:05.570 に答える