2017-12-03 11 views
1

私はメタクラスを構築しようとしています。私は本当にそれを得ていると思っていました。そして、私はこのメタクラスの各インスタンスに対してクラスメソッドを持たせたいと思います。お互いを呼び出すメタクラスメソッドのベストプラクティスは何ですか?

class MyMeta(type): 
    """A metaclass""" 
    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

私はそれでpylintを実行すると、cls._fooは困難があります。私は、コードを実行しようとすると

[pylint] E1120:No value for argument 'cls' in unbound method call 

を(私のコードは、これよりも複雑である)うまく実行されている、とやっているように見えます私はそれがすることを期待しています。だから私はこの事件をどのように修正するつもりですか?正確にはどういう意味ですか?

@staticmethodsというものを正しく宣言していないというエラーは聞こえますが、@classmethodとマークすることはできません。なぜなら、それはMetaclassメソッドになるからです。

関連検索は、人々がコンストラクタや何かを動的に追加している場所について話しているようですが、そうは思いません。まだメタクラスに関する何かを誤解していますか?

私が本当に望むのは、メタクラスで定義されたお互いを呼び出すクラスメソッドです。これを行うより良い方法はありますか?

+0

https://stackoverflow.com/questions/35208443/pylint-complains-no-value-for-argument-cls – SteveJ

+0

@SteveJそれは私が言及したケースです。その質問のOPは、コンストラクタが派生クラスで宣言されることを期待しています。これはここでは当てはまりません。 – McKay

答えて

1

[pylint] E1120:引数 'CLS' の値がありませんバインドされていないメソッド呼び出し

限り、あなたのmetaclasssが懸念されるとして、あなたの_foo_bar方法は普通のPythonのメソッドですで - Pythonのことを意味これらのメソッドを呼び出すときに自動的に各クラス(メタクラスインスタンス)への参照が書き込まれます。

そして、これはメタクラスなので、わかりやすくするために、セマンティクスと読みやすくするために、最初のパラメータの名前をの代わりにselfとしてください。

問題は、pylintがそれについて熟知していないということです。ハードコードされたselfが必要になる可能性があります。 あなたのコードは、この点では無修正です。

あなたがしなければならないことは、pylintがこれらの行を無視するメタコメントを追加することです。fortunatelly、Pylintはブロックレベルで許可しますが、各行にマークする必要があるツールとは異なります。

class MyMeta(type): 
    """A metaclass""" 
    # pylint: disable=no-value-for-parameter 

    def __new__(mcs, name, bases, attributes): 
     pass 

    def _foo(cls): 
     pass 

    def _bar(cls): 
     cls._foo() 

あなたのメタクラスの例は、「メタコメント」であり、pylintはエラーを無視します。

+0

+1、これはかなり意味があります。私はあなたの答えがどれくらいかと思っています。「私はこれがバィリン/ピリンチンの限界だと思っています。あなたが間違っているとは思わないが、ここには信頼できるものは何もない。 – McKay

+0

私はもう少し明確に質問のタイトルを編集しました。 – McKay

+0

それは私の答えを変えないでしょう。読んでいる部分があります。「...あなたのやり方をするのがはるかに良い」 メタクラスのこれらのメソッドは、クラスのインスタンスには表示されません。クラスメソッドのみです。 (これは時には利点とデザインですが、私はPythonのdatetimeを望みます。 – jsbueno

関連する問題