Почему я должен использовать classmethod в python? [дубликат]


На этот вопрос уже есть ответ здесь:

Я пишу функцию в каком-то классе на 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?

1 3

1 ответ:

Если вы видите метод _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()   
    

Вы можете прочитать больше о классе и переменной экземпляраздесь .