2017-04-16 71 views
1

我正在寫一些Python中的函數,人們建議我添加一個@classmethod裝飾器。爲什麼要在python中使用classmethod?

我的代碼:

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

另外,如果這個類不包含其他內容,那麼最好使用一個函數和'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

相關問題