Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания
СегодняЧасть 16 тем PythonСтатья, сегодня мы поговорим о метаклассах в Python.
Метаклассы в PythonРасширенное использование, если вы никогда раньше не видели этот термин или не слышали об этом понятии, это вполне нормально, потому что, с одной стороны, этоРедкое использование, с другой стороны, относительноне легко понять. Так много разработчиков Python не понимают его очень глубоко, в результате чего на рынке не так много связанной информации. Я также прочитал код Дэниела, чтобы открыть дверь в этот новый мир.
все является объектом
Мы представили его раньше, в Pythonвсе является объектом, обратите внимание, что все является объектом. Все мы знаем, что объекты являются результатом инстанцирования классов, и мы можем просто сравнивать классы и объекты с отношениями между пресс-формами и готовыми изделиями. Форма — это класс, а изделие, изготовленное из формы, — это объект.
Эта метафора ближе по идее, но не совершенна. Поскольку одна форма может фактически производить несколько продуктов, у одного продукта есть только одна форма. Но языки программирования разные, ведь классы могут наследовать имножественное наследование, то есть объект может соответствовать нескольким классам. Так что аналогия не особенно уместна, но отношения между классами и объектами верны.
Но есть проблема: поскольку все в Python является объектом, значит ли это, что класс на самом деле является объектом? Другими словами, плесень на самом деле является продуктом другой формы? Точно так же форма этой формы на самом деле является продуктом другой формы, так что же произойдет, если мы продолжим спрашивать?
Это очень просто, мы узнаем, проведя эксперимент, мы можем использовать ключевое слово _class__ для просмотра типа переменной, затем мы можем проверить отношение, вызвав его несколько раз:
Из приведенного выше рисунка видно, что num — это переменная типа int. Продолжим рассмотрение типа int,получил тип типа. И когда мы посмотрим на тип типа, мы обнаружим, что то, что мы получаем, по-прежнему является типом типа.
Таким образом, мы можем понять, что тип — это метакласс, используемый для создания всех классов в Python, и это форма всех форм. В Python мы называем класс класса метаклассом. Таким образом, тип — это встроенный метакласс в Python, и мы также можем создать нужный нам метакласс. С метаклассами создаваемый нами объект также является классом, а не экземпляром.
Создавайте классы динамически
Поняв, что тип — это основа всех классов, можно просто взглянуть на динамические классы.Динамические классы — одна из самых больших особенностей динамических языков., как типичный динамический язык, Python естественным образом поддерживает динамическое создание типов.
В Python одним из способов создания динамических типов является ключевое слово type. Звучит немного неожиданно, разве функция type не используется для запроса типа объекта, как можно создать класс?
Это на самом деле типдругое использование, как метакласс для создания класса. В этом случае функция типа принимает 3 аргумента: имя типа, кортеж суперклассов и словарь. За исключением первого параметра, последние два параметра могут быть пустыми. Например, давайте рассмотрим пример:
Обратите внимание, что результат, возвращаемый типом, является классом, а не экземпляром. Таким образом, мы также можем создавать экземпляры из него:
hello = Hello()
Это создает простейший пустой класс, в котором ничего нет, и он эквивалентен следующему коду.
class Hello:
pass
Мы также можем заполнить свойства и методы для этого класса в параметре типа:
def hello_world(self):
print('hello')
Hello = type('Hello', (), {'hello':hello_world, 'num': 3})
Таким образом, мы создаем метод hello для класса Hello и атрибут num, равный 3. Мы можем попробовать назвать это:
То есть мы можем использовать тип для определения наших собственных классов в соответствии с нашими потребностями, но тип может не только получать тип объектов, но и создавать новые классы.Это может показаться немного неинтуитивным, но на самом деле это имеет смысл. В Python мы создаем строковый объект, вызывая str, создаем целочисленный объект с помощью int и создаем объект класса по типу.
реализовать наследование
Как мы уже говорили, когда мы используем тип для создания класса, мы также можем передать кортеж родительского класса для реализации наследования класса.
Например, мы создаем класс с именем World, чтобы наследовать только что созданный класс Hello по типу, а затем добавляем в него дополнительные функции:
def say_world(self):
print('World')
World = type('World', (Hello, ), {'world': say_world})
Обратите внимание, что второй переданный здесь параметркортеж родительских классов, так как это кортеж, когда есть только один элемент, необходимо добавить запятую, чтобы указать, что это кортеж. Класс, созданный таким образом, имеет тот же эффект, что и статический класс, который мы определяем через class:
То есть мы можем сначала реализовать функции, а затем собрать эти функции в новые классы в соответствии с потребностями задачи. Очевидно, что это гораздо более гибко, чем традиционный C++ и языки со статической типизацией, такие как Java.
Суммировать
Конечно, мы можем создавать динамически создаваемые классы через тип, но из приведенного выше процесса использования следует видеть, что это не очень удобно, иМногие расширенные функции сложно реализовать. В качестве простого примера, например, мы хотим динамически добавить некоторые динамические методы к существующему классу для создания нового класса. Это трудно сделать, когда мы используем тип. Тип действительно не является основным применением метакласса Python, метакласс является главным, но из-за нехватки места эта часть будет помещена в следующую статью.
Конечно, метаклассы — это такое продвинутое использование, о котором говорили основатели Python.99% программистов на Python это не нужно. Так что если вы думаете, что это очень сложно понять, не беда, просто знайте такое понятие.
На сегодня все, если вам понравилась эта статья, если можете, пожалуйстаобращать внимание, подбодрите меня и облегчите доступ к другим статьям.