ホームページ  >  に質問  >  本文

python @property @staticmethod

这两个东西在什么情况下用

PHP中文网PHP中文网2741日前786

全員に返信(1)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:06:34

    簡単に言うと

    • @property は、Python の getter/setter を置き換えるために使用されるデコレータです。クラス属性をラップ、処理、カプセル化でき、読み取り専用属性を簡単に作成することもできます。 インターフェース Simpleget_XXXset_XXX のような面倒なゲッター/セッターを使用することなく、直感的にプロパティにアクセスできるためです。当初は完全な説明を書きたかったのですが、よく考えてみると、十分に包括的ではないと感じたので、この分野に精通している他の専門家がいる場合は、将来完成するのを待ちます。質問者と私に意見を述べてください。

    • @staticmethod これは 実際には何の役にも立たない 不必要なデコレータだと思います (これについて異なる意見がある場合は、お気軽に議論してください。私はこれについて本当に議論したいと思っています)


    (この答えは少し難しくなります。繁体字中国語を読むのが難しい場合は、ブラウザを使用して簡体字中国語に変換して読むことができます...)

    @staticmethod

    機能と使用シナリオ

    まずそれについて話しましょうstaticmethod さて、staticmethod によって変更されたメソッドは特別な最初の引数を受け取りません (一般的なインスタンス メソッドと classmethod によって変更された カテゴリ メソッド はそれぞれそれを受け入れます)および最初のパラメータとしてクラス参照)、これにより、静的メソッドは通常の関数のようになりますが、モジュール レベルで直接定義されるのではなく、たまたまクラス内で定義される点が異なります。

    彼の 使用シナリオ は次のとおりです。クラス内の関数が selfcls などのインスタンスやクラスへの参照を必要としない場合、静的メソッドを使用するとより簡潔になり、仕事を得ることができます。効率的に行われます。

    1. 簡潔に言うと、重要ではない追加の引数を受け取る必要はないということです

    2. 一般的なインスタンス メソッドはバインドされたメソッド (オブジェクト) であり、それを使用したいときに生成されるため、コストが少し高くなりますが、静的メソッドはそうではありません。

    実用的ですか?

    しかし、それは現実的ではないと思います。まず、コード内でクラスに直接関連する関数に classmethod を使用して、クラスを完成させます。関連操作 (たとえば、__init__ の置き換え、またはより多くの子 staticmethod をディスパッチするための上位レベルのメソッドとして)。

    それがクラスに関連していない (インスタンスとは何の関係もない) 場合、カテゴリ静的メソッドの目的は今のところ 1 つだけ思いつきます。それは、クラスに抽象レベルを持たせることです。 call (はい、namespace について話しています) この関数はクラスに直接接続しませんが、クラスに関連しています。

    しかし、Python では、namespace を使用するのは非常に簡単です。最初に定義したい関数をモジュール レベルで静的メソッドとして定義し、それを関連するカテゴリのできるだけ近くに配置することもできます。十分だと思います (ルチアーノ・ラマーリョの意見)。

    反省

    上の段落を入力し終えた直後に、Julien Danjou による素晴らしい記事を読みました。
    Python で静的メソッド、クラス メソッド、または抽象メソッドを使用する方法に関する決定版ガイド
    I この記事は、誰にでも強くお勧めします。 Python のメソッドを理解したい人。

    この記事では、staticmethod の 2 つの利点を説明します。最初に述べた点は、静的メソッドはインスタンス メソッドよりも簡潔で効率的であるということです。 2 番目のポイントは、静的メソッド はクラスとは関係がなく、クラス に属しているということです。これは、クラスのサービスをカスタマイズできることを意味します。これは少し理解するのが難しいので、例を見てみましょう (Julien Danjou の記事の例):

    リーリー

    モジュールレベルで mix_ingredients を定義した場合、Pizza を継承するサブクラスを扱うとき、mix_ingredients を変更しても混合材料の動作を変更できないと想像してみましょう (この関数は他のクラスで使用されている場合)、cook をオーバーライドする必要があります。

    この理由により、少なくとも彼は、静的メソッドと一般的なメソッドの最大の違いを指摘しました。静的メソッドは特定のカテゴリ に属します。

    しかし、私はまだ元のアイデアに固執しています。おそらく mix_ingredients はもっと良く書けるかもしれないし、ピザのような非抽象カテゴリの場合は、それをまったく継承すべきではないか、継承するときのオーバーライドメソッドはそうではありません。 mix_ingredients を変更するのは、cook を変更するのと同じくらい負担だとさえ感じるかもしれません。

    概要

    上記のすべて 私は だと思いますが、いつか staticmethod で実際に優雅に使用できるようになるかもしれません。今日は自分の無知と表面的な理解を認めるかもしれません。あなたに関しては、十分な知識があり、自分自身を納得させることができれば、どの立場も間違っていないと思います:)


    私が回答した質問: Python-QA

    返事
    0
  • キャンセル返事