Что такое метакласс в Python?

Опубликован: 12.08.2024 23

Метакласс - это класс классов, из которого создаются другие классы (другими словами метакласс отвечает за генерацию классов и позволяет определять и изменять поведение других классов и их экземпляров, а также добавлять свои собственные методы и атрибуты).

В Python все является объектом или экземпляром класса, из которого он создается.

Любой класс в Python является объектом специального класса type, который является метаклассом по умолчанию и отвечает за создание классов. При этом, класс type является метаклассом самого себя!

Каждый класс в Python по умолчанию наследуется от базового класса object.

Например, мы можем создать класс Student и его экземпляр (student_obj), а затем вывести тип созданных объектов с помощью функции type():

class Student:     # создание класса Student 
    pass

student_obj = Student()    # создание экземпляра класса Student

# тип экземпляра
print(type(student_obj))
<class '__main__.Student'>

# тип класса
print(type(Student))
<class 'type'>

Таким образом, метакласс используется для создания классов, а уже из классов создаются объекты (или экземпляры классов).

Создание пользовательского метакласса.

Пользовательский метакласс должен наследовать метакласс type и обычно переопределять методы, используемые метаклассом для создания любого класса (объекта):

  • new() - это метод, который вызывается перед init(), создает объект и возвращает его. Мы можем переопределить этот метод, чтобы управлять тем, как создаются объекты;
  • init() - этот метод просто инициализирует созданный объект, передаваемый в качестве параметра.

Пример создания пользовательского метакласса, который добавляет метод custom_method() в класс MyClass:

class MyMeta(type):
    def __new__(cls, name, bases, dct):
        dct['custom_method'] = lambda self: print('Hello, world!')
        return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=MyMeta):
    pass

obj = MyClass()
obj.custom_method()   # вывод пользовательского метода метакласса
Hello, world!

Похожие посты

В чем разница между методами экземпляра, методами класса и статическими методами в Python?

Что такое дескрипторы в Python?

В чем разница между статическими и динамическими атрибутами класса?

Как создать класс и объект класса в Python

Комментариев нет.