Рубрики
Без рубрики

Python ClassMethod ()

Встроенная функциональная функция Python ClassMethod () префиксов определения метода в классе в качестве аннотации @classmethod. Эта аннотация преобразует метод нормального экземпляра в метод класса. Разница между методом класса и экземпляра заключается в том, что Python пропускает сам класс как первый неявный аргумент способа, а не экземпляра, на котором он … Python ClassMethod () Подробнее »

Автор оригинала: Chris.

Встроенная функция Python ClassMethod () префиксы определения метода в классе как аннотация @classmethod Отказ Эта аннотация преобразует метод нормального экземпляра в метод класса. Разница между методом класса и экземпляра заключается в том, что Python проходит сам класс в качестве первого неявного аргумента метода, а не экземпляра, на котором он называется.

В этом руководстве я покажу вам один из малоизвестных секретов Python, который отделяет промежуточные соединения от экспертов: методы классов. Вы можете знать разницу между методом экземпляра и концептуально методом класса. (Если вы этого не сделаете, этот учебник для вас.) Но вы также знаете, как создать метод класса в Python? Если нет, прочитайте, потому что этот учебник покажет вам!

Метод синтаксического класса

Syntax: 
classmethod(function)    # <--- This is considered unpythonic
@classmethod                        # <--- As a prefix before the used method

Самый питонический способ объявить метод класса – следующий синтаксис декоратора:

class C:
    @classmethod
    def f(cls, arg1, arg2, ...):
        None

Как вызвать метод класса?

Существует два способа использования метода класса:

  • Вы можете назвать это на таком классе, как C.F (ARG1, ARG2, ...) , или
  • Вы можете назвать это на таких экземплярах, как C (). F (arg1, arg2, ...) Отказ

Обратите внимание, что Python неявно проходит сам класс – в Python, все, включая класс, является объектом – в качестве первого аргумента. Грубо говоря, если вы позвоните C.F (ARG1, ARG2, ...) Python действительно работает f ( c , arg1, arg2, ...) С объектом класса пропускается как первый аргумент.

Пример метода класса

Когда использовать метод класса? Вы обнаружите, что методы класса часто используются в заводской структуре. Фабрика фабрики является одним из самых популярных шаблонов разработки программного обеспечения: так называемый фабричный метод создает новые экземпляры определенного типа. Он отвечает за фактически создание экземпляров из определенного класса.

В следующем примере вы определяете класс Кофе Это представляет собой реальный кофе, служащий в кафе. Есть много специальностей, таких как Cappucino (80% молока, 20% кофе), эспрессо MacChiato (30% молока, 70% кофе) и LATTE MACCHIATO (95% молока, 5% кофе).

Вы используете методы классов, чтобы позволить пользователям удобно вызывать фабричные методы вместо того, чтобы настроить сами на уровне молока. Вместо того, чтобы звонить Кофе (80, 20, 'Arrabica') пользователь может просто позвонить капучино () Чтобы создать тот же экземпляр класса Кофе Отказ Это упрощает создание новых экземпляров и может улучшить читаемость и удобство использования вашего кода:

class Coffee:

  def __init__(self, milk, beans):
    self.milk = milk # percentage
    self.coffee = 100-milk # percentage
    self.beans = beans


  def __repr__(self):
    return f'Milk={self.milk}% Coffee={self.coffee}% Beans={self.beans}'


  @classmethod
  def cappuccino(cls):
    return clf(80, 'Arrabica')
  

  @classmethod
  def espresso_macchiato(cls):
    return cls(30, 'Robusta')
  

  @classmethod
  def latte(cls):
    return cls(95, 'Arrabica')


print(Coffee.cappuccino())
print(Coffee.espresso_macchiato())
print(Coffee.latte())

Три строки выхода:

Milk=80% Coffee=20% Beans=Arrabica
Milk=30% Coffee=70% Beans=Robusta
Milk=95% Coffee=5% Beans=Arrabica

Вы можете запустить этот пример в нашей интерактивной ноутбуке Jupyter:

Метод интерактивного примерного класса

Упражнение : Можете ли вы создать еще одну специальность кофе?

Класс Метод именования Конвенция: CLS VS Self

В предыдущем примере вы видели Конвенцию именования первого аргумента метода класса: это три символа CLS -Чтать для «класса», но мы не можем взять это, потому что Класс это Зарезервировано ключевое слово Отказ Вы можете использовать любое имя, которое вы хотите, но используете имя CLS Ожидаемая конвенция, и она настоятельно рекомендуется. Конвенция именования первого неявного аргумента методов экземпляра – это имя Я Отказ

Связанная статья: Я в Питоне

Метод класса – это функциональный декоратор

Декораторы помогают добавлять функциональность к существующему коду без необходимости изменять сам код. Декораторы так называются, потому что они украшают код, они не изменяют код, но они заставляют код сделать разные вещи, используя украшение. Теперь, когда мы поняли замыкание, мы можем работать наш путь шагом к пониманию и использованию декораторов.

@classmethod это функциональный декоратор. Это коротко для звонка ClassMethod (M) Для метода м Что вы бы украшали.

Вот тот же самый упрощенный пример кофе без использования декоратора и используя классный Method () вместо этого:

class Coffee:

  def __init__(self, milk, beans):
    self.milk = milk # percentage
    self.coffee = 100-milk # percentage
    self.beans = beans
    


  def __repr__(self):
    return f'Milk={self.milk}% Coffee={self.coffee}% Beans={self.beans}'


  def cappuccino(cls):
    return cls(80, 'Arrabica')
  

Coffee.cappuccino = classmethod(Coffee.cappuccino)
print(Coffee.cappuccino())

Вывод одинаково:

Milk=80% Coffee=20% Beans=Arrabica

Однако это не рекомендуемый способ использовать декоратор с аннотацией @!

Связанная статья: Декораторы

Метод класса VS Метод экземпляра

Если вы не используете @classmethod Аннотатор, вы получаете метод экземпляра по умолчанию. Метод экземпляра требует, чтобы первый аргумент Я является ссылкой на само экземпляр, на котором называется метод. Метод класса ожидает ссылки на класс, а не экземпляр, как первый аргумент CLS Отказ Таким образом, разница между методами класса и экземпляра заключается в том, что Python передает классу, а не экземпляр (объект) в качестве первого неявного аргумента.

Вот минимальный пример класса и метода экземпляра:

class C:

    @classmethod
    def f(cls):
        None


    # instance method
    def g(self):
        None



# call class method:
C.f()

# call instance method:
C().g()

Существует два способа использования метода класса:

  • Вы можете назвать это на таком классе, как C.F (ARG1, ARG2, ...) , или
  • Вы можете назвать это на таких экземплярах, как C (). F (arg1, arg2, ...) Отказ

Но есть только один способ использования метода экземпляра:

  • Вы можете назвать это на таких экземплярах, как C (). G () Отказ

Способ класса против статического метода

Вы можете знать статические методы от языков программирования, таких как C ++ или Java. Это методы, которые существуют независимо от того, создали ли вы экземпляра класса. Вот почему они не используют никакой переменной экземпляра в корпусе метода. Если вы хотите использовать статический метод в Python, вам нужно использовать @staticmethod аннотация, а не @classmethod Аннотация. Разница состоит в том, что статические методы не ожидают от ссылки на либо экземпляр, либо в классе в качестве подразумеваемого первого аргумента.

Вот пример сравнения методов класса, методы экземпляра и статические методы:

class C:

    @classmethod
    def f(cls):
        None


    # instance method
    def g(self):
        None


    @staticmethod
    def h():
        None


# call class method:
C.f()

# call instance method:
C().g()


# call static method:
C.h()

Резюме

Встроенная функция Python ClassMethod () префиксы определения метода в классе как аннотация @classmethod Отказ

class C:


    @classmethod
    def f(cls, arg1, arg2, ...):
        None

Эта аннотация преобразует метод нормального экземпляра в метод класса.

Разница между методом класса и экземпляра заключается в том, что Python проходит сам класс как первый неявный аргумент способа, а не экземпляра, на котором его называется:

class C:


    @classmethod
    def f(cls, arg1, arg2, ...):
        None


    # instance method
    def g(self, arg1, arg2, ...):
        None

Хотите увеличить свои навыки Python в веселой и легкой потребности? Рассмотрим следующие ресурсы и стать магистральным кодером!

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.