Докато се натъквах на новите функции, добавени в Python 3.7, новодобавеният модул привлече вниманието ми, който е известен като „класове от данни“. Този модул излага декоратор на клас, наречен „dataclass“, който обвива дефиницията на класа и мирише много подобно на „collections.namedtuple“. На пръв поглед изглеждаше като чиста магия, защото според документацията прави черна магия върху „анотации“, които бяха добавени на python3.5 и инжектира методи на клас като „__init__“, „__repr__“ и „__eq__“.

Ето примерна демонстрация на използването му:

from dataclasses import dataclass
@dataclass
class Vector:
    x: float # type annotation
    y: float # type annotation
# way to use 
v = Vector(3.4, 5.5)
# most useful operation :P
print(v.x)
print(v.y)

Това изглежда наистина интересно за мен, защото първо, ние дори не сме дефинирали метод __init__ и той някак си го е направил само с използване на анотации за типове и второ, мисля, че това е чиста черна магия под капака, която е възможна чрез мета-програмиране.

Тъй като самият аз съм любител на метапрограмирането, опитах се и внедрих функцията поради две прости причини.
1. Страхувам се от магически код.
2. Склонен съм да се ровя какво има вътре в тези магически гробове или унищожи мета уменията ми за питон или ще ми счупят главата.

ЗАКЛЮЧЕНИЕ:

Мисля, че те са страхотна нова алтернатива на именувания кортеж, тъй като можете да добавяте методи към класа, а не прост n-измерен вектор, предоставен от „collections.namedtuple“. Въпреки това, той не предоставя проверка на типа по време на инициализация, което означава, че това също е валиден обект Person:

person = Person(4, 4)
print(person.name) # prints 4

Надявам се, че тази статия дава представа как тази функция може да е била внедрена под капака. Благодаря много.