Метакласи Python в дії

pic

Ми створювали моделі в Django / SQLAlchemy.

Ось приклад:

class Order(models.Model):  
 user = models.ForeignKey('user.User')  
 date = models.DateField()  
 order_id = model.CharField()

Чи замислювались ви над тим, чому, незважаючи на те, що ми встановили поле як екземпляр DateField(), коли ви робите:

order = Order.objects.last()  
print(order.order_id)

.. ви не отримуєте екземпляр DateField(), натомість ви отримуєте значення поля date з бази даних.

Справа в тому, що тут активно працює метаклас Python... метаклас фактично переназначив атрибути вашого класу Order, щоб вони мали кастомну поведінку; а саме, щоб повертати значення поля order_id з бази даних.

Ось погляньте на цей метаклас, який виконує цю магію: https://github.dev/django/django/blob/main/django/db/models/init.py#94

Перекладено з: Python MetaClasses in Action

Leave a Reply

Your email address will not be published. Required fields are marked *