2016-12-27 9 views
0

静的メソッドとしてはうまくいくと思うコードがいくつか出てきますが、コーダーはいくつかのメソッドでデコレータを配置していないことがあります。他の方法については、それらは適所にある。selfパラメータを使用しないすべてのメソッドを静的クラスにする必要がありますか?

だから、スタティックメソッドデコレータを使用したり使用したりしなかったときに、何か覚えていたかもしれません。このアプローチに利点はありますか?それとも、デコレータを省略して怠け者なのか?

ありがとうございました。

+0

あなたの質問に嘘のための答えは[こちら](http://stackoverflow.com/a/735978/4693568) – Ja8zyjits

答えて

1

具体的なコードを見ることなく、一般的なガイドラインを示すのはかなり難しいです。私は一般的に、staticmethodはコミュニティからの愛の全体をたくさん得ていないと言うでしょう。あなたは、我々はすべての静的メソッドがどのように限られた を知っている...投稿数...例えば:

でこれを見ることができます。 (私は新しいスタイルのクラスと 記述子を発明していたときに、Python 2.2日で というバックグラウンドを持っていましたが、私はクラスメソッドを実装するつもりでしたが、最初は を理解し、 。 は、その後、それらを削除し、クラスメソッドのみを提供するには遅すぎた。)

私もスタイルガイドが「NO静的メソッド」は、代わ​​りに、モジュールレベルのメソッドを好むていないと述べた場所を働いてきました。


私はほとんど上記のアドバイスに同意します。静的メソッドを使用する場合は、を防御する準備ができている必要があります。なぜメソッドがモジュール名前空間ではなくクラス名前空間の一部である必要がありますか。してもしなくてもよい状況に応じて意味を成すかもしれないいくつかの防御があります

  1. あなたはこれが私の経験では非常に稀にしか起こりませんサブクラスに
    • のメソッドをオーバーライドしたい - そして頻繁にするとき、それが発生した場合は、最初にclassmethodが必要でした。
  2. この方法は、意味的には意味があります。

[OK]を、今selfなしの方法について話をすることができます。 Python3.xはメソッドの動作を変更しました。次python3.xでの作品ではなくpython2.x ...

>>> class Foo(object): 
... def static(): 
...  return 'bar' 
... 
>>> print(Foo.static()) 
bar 

しかし、それはインスタンスからstaticを呼び出すために動作しません。代わりに、それはかなり役に立たないエラーメッセージを与えるでしょう:

>>> print(Foo().static()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: static() takes 0 positional arguments but 1 was given 

私はあなたがpython3を持っていたと思います。xのみのプロジェクトで、実際にはメソッドがインスタンスに対して呼び出されないようにしたいのですが、クラス上でメソッドを呼びたいと思っていました... 。

そうでない場合は、おそらくを入力して、メソッドが@classmethodの方が良いかどうか、またはメソッドをモジュールの名前空間に移動するかどうかを検討してください。そのメソッドの使い勝手が向上します。また、メソッドを呼び出す/使用する方法を知るために、コードを読んでいる人に多くの情報を提供します。

私は本当にあなたがこれを望む状況を考えることはできません

...

+0

Py 3.xの暗黙的な最初の引数を省略することはできませんでした。Pycharmが自己のメソッドを自己完結させてしまったと思います。 – whiteredblack

+0

@poly_purple - あなたが_can_であるという理由だけで、あなたが_should_を意味するわけではありません。 IIRCでは、python3.xはほとんどのユーザーが強制なしで正しいことを続けると仮定しているため、パフォーマンスの最適化として最初の引数の型チェックを削除しました。 – mgilson

関連する問題