2017-04-16 114 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