2017-04-16 2 views
1

私はPythonでいくつかのクラスの関数を書いています。人々はこの関数に@classmethodデコレータを追加するように私に提案しました。なぜPythonでクラスメソッドを使うべきですか?

マイコード:

import random 


class Randomize: 
    RANDOM_CHOICE = 'abcdefg' 

    def __init__(self, chars_num): 
     self.chars_num = chars_num 

    def _randomize(self, random_chars=3): 
     return ''.join(random.choice(self.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

提案の変更:

@classmethod 
    def _randomize(cls, random_chars=3): 
     return ''.join(random.choice(cls.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

私はほとんど常にのみ_randomize機能を使用しています。

私の質問は、classmethodデコレータの機能を追加した場合のメリットは何ですか?

+5

このメソッドでは、インスタンスの状態は使用されず、通常は「self」と呼ばれます。また、インスタンスを作成せずにクラスでテストできることを意味します。 – jonrsharpe

+0

また、このクラスにelseがあまり含まれていない場合は、関数と 'functools.partial()'を使うほうが良いでしょう。多分。 –

答えて

2

_randomizeメソッドが表示されている場合、インスタンス変数(initで宣言されています)は使用されていませんが、クラスvar、すなわちRANDOM_CHOICE = 'abcdefg'を使用しています。

import random 

class Randomize: 
    RANDOM_CHOICE = 'abcdefg' 

    def __init__(self, chars_num): 
     self.chars_num = chars_num 

    def _randomize(self, random_chars=3): 
     return ''.join(random.choice(self.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

つまり、メソッドはインスタンスメソッドでなくてもかまいません。クラスで直接呼び出すこともできます。

Randomize._randomize() 

ここで質問にはどんな利点がありますか?

  • 私が推測するように、オーバーヘッドを持つこの方法を使用するためにインスタンスを作成する必要はありません。

    ran = Randomize() // Extra steps 
    ran._randomize() 
    

あなたは、クラスとインスタンス変数hereについての詳細を読むことができます。

関連する問題