Встроенная функция 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 и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.