dataclassy là sự triển khai lại các lớp dữ liệu trong Python - một giải pháp thay thế cho mô-đun dataclasses tích hợp để tránh nhiều cạm bẫy phổ biến của nó. dataclassy được thiết kế linh hoạt hơn, ít dài dòng hơn và mạnh mẽ hơn so với dataclasses, trong khi vẫn giữ được giao diện quen thuộc
Nói tóm lại, dataclassy là một thư viện để di chuyển dữ liệu xung quanh các chương trình Python của bạn được tối ưu hóa cho tốc độ, sự đơn giản và sự hài lòng của nhà phát triển
from dataclassy import dataclass from typing import Dict @dataclass class Pet: name: str species: str fluffy: bool foods: Dict[str, int] = {}
Tại sao nên sử dụng lớp dữ liệu?
Phần này mô tả các động lực khác nhau để sử dụng phân lớp dữ liệu thay vì phân lớp dữ liệu
Nâng cấp các lớp dữ liệu của bạn
- tùy chọn trang trí mới
pip install dataclassy
77 tạopip install dataclassy
0 để giảm dung lượng bộ nhớ và cải thiện hiệu suất tra cứu thuộc tínhpip install dataclassy
1 nối danh sách tham số củapip install dataclassy
2 vàopip install dataclassy
3 để sử dụng các đối số không mong muốnpip install dataclassy
4 cho phép hủy cấu trúc các thể hiện của lớp, giống như các bộ dữ liệu được đặt tênpip install dataclassy
5 tự động ẩn các trường riêng khỏipip install dataclassy
6 và loại trừ chúng khỏi so sánh và lặp lại
- Cách sử dụng và tùy chọn của
pip install dataclassy
7 được kế thừa [các lớp con không phải sử dụng lại trình trang trí] - các trường có thể theo bất kỳ thứ tự nào - các trường có giá trị mặc định được sắp xếp lại - làm cho việc kế thừa trở nên khả thi
- các thùng chứa có thể thay đổi [
pip install dataclassy
8,pip install dataclassy
9,pip install dataclassy
10 và hơn thế nữa] được sao chép tự động khi được sử dụng làm giá trị mặc định - chức năng mới.
pip install dataclassy
11 vàpip install dataclassy
12
Ngoài ra, lớp dữ liệu
- thực hiện tất cả các tùy chọn trang trí của dataclasses
- rất nhỏ [~150 LỘC; khoảng 25% kích thước của lớp dữ liệu]
- nhanh, phù hợp với hiệu suất của lớp dữ liệu khi
pip install dataclassy
13 và vượt quá đáng kể khipip install dataclassy
14 - được thử nghiệm với CPython 3. 6 - 3. 10 và PyPy 3. 6 - 3. 7
- hỗ trợ nhiều kế thừa và siêu dữ liệu tùy chỉnh
- đi kèm với sự hỗ trợ cho mypy
khác biệt khác
API của dataclassy bị ảnh hưởng mạnh mẽ bởi dataclasses', nhưng tập trung vào sự tối giản và sang trọng
- không có
pip install dataclassy
15 hoặcpip install dataclassy
16. Sử dụngpip install dataclassy
17,pip install dataclassy
18 hoặcpip install dataclassy
19 để tái tạo các chức năng của nó - không có
pip install dataclassy
10. Chỉ cần thêm đối số vàopip install dataclassy
11 - không cần
pip install dataclassy
12. Chỉ cần bỏ qua gợi ý loại của trường để bỏ qua nó
Cũng xem xét
pip install dataclassy
13 nếu bạn cần xác thực phức tạp và chuyển đổi loạipip install dataclassy
14 nếu bạn cần kiểm tra loại nghiêm ngặt
Cách sử dụng
Cài đặt
Cài đặt bản phát hành mới nhất từ PyPI với pip
pip install dataclassy
Hoặc cài đặt phiên bản phát triển mới nhất ngay từ kho lưu trữ này
pip install dataclassy1
di cư
API của dataclassy tương tự như dataclasses. Nếu bạn chỉ đơn giản sử dụng trình trang trí và các chức năng khác, có thể di chuyển ngay lập tức từ lớp dữ liệu sang lớp dữ liệu bằng cách thay đổi đơn giản
pip install dataclassy1
đến
pip install dataclassy9
Nếu không, bạn sẽ phải thực hiện một vài lần tái cấu trúc dễ dàng [điều đó sẽ khiến bạn có mã sạch hơn. ]. Tham khảo bảng bên dưới Sự khác biệt hoặc bỏ qua phần Ví dụ để xem hoạt động của lớp dữ liệu
Điểm tương đồng
trình trang trí
pip install dataclassy15 của dataclassy lấy tất cả các đối số giống như dataclasses', cộng với đối số của chính nó và do đó sẽ là một sự thay thế thả xuống
dataclassy cũng thực hiện tất cả các chức năng của dataclasses.
pip install dataclassy16,
pip install dataclassy17,
pip install dataclassy18,
pip install dataclassy19,
pip install dataclassy90 và
pip install dataclassy91 [hai cái cuối cùng có bí danh lần lượt là từ
pip install dataclassy92 và
pip install dataclassy93] và chúng sẽ hoạt động như bạn mong đợi
sự khác biệt
Mặc dù API của dataclassy tương tự như dataclasses', nhưng khả năng tương thích với nó không phải là mục tiêu [điều này tương tự như mối quan hệ giữa Crystal và Ruby]
dataclassy có một số điểm khác biệt quan trọng so với dataclasses, chủ yếu phản ánh phong cách tối giản và cách triển khai của nó. Những khác biệt này được liệt kê bên dưới và được mở rộng đầy đủ trong phần tiếp theo
dataclassesdataclassyinit-only các trường biến có loạipip install dataclassy10đối số đến
pip install dataclassy11trường biến lớp có loại
pip install dataclassy12trường không có loại chú thích mặc định có thể thay đổi
pip install dataclassy97
pip install dataclassy98giá trị mặc định động
pip install dataclassy99
pip install dataclassy50trường bị loại trừ khỏi
pip install dataclassy51
pip install dataclassy52
pip install dataclassy18 trình bao bọc loại hoặc trường
pip install dataclassy54"khởi tạo muộn"
pip install dataclassy55
pip install dataclassy56lớp dữ liệu trừu tượng
pip install dataclassy57
pip install dataclassy58
Có một vài khác biệt nhỏ, quá
pip install dataclassy
17 trả vềpip install dataclassy
50 thay vìpip install dataclassy
51 và có một tham số bổ sung giúp lọc các trường nội bộ- Cố gắng sửa đổi một phiên bản bị đóng băng làm tăng
pip install dataclassy
52 kèm theo lời giải thích thay vìpip install dataclassy
53
Cuối cùng, có một số cải tiến về chất lượng cuộc sống, mặc dù không liên quan trực tiếp đến quá trình di chuyển, nhưng sẽ cho phép bạn làm cho mã của mình sạch hơn
pip install dataclassy
7 không cần phải được áp dụng cho mọi lớp con - hành vi và các tùy chọn của nó được kế thừa- Không giống như các lớp dữ liệu, các trường có giá trị mặc định không cần tuân theo những trường không có chúng. Điều này đặc biệt hữu ích khi làm việc với các lớp con, điều gần như không thể xảy ra với các lớp dữ liệu
- dataclassy thêm chú thích loại
pip install dataclassy
55 để biểu thị các biến phải là thể hiện của lớp dữ liệu chung - dataclassy có
pip install dataclassy
11 được đề xuất như một công thức cho các lớp dữ liệu được tích hợp sẵn - Các phương thức so sánh được tạo [khi
pip install dataclassy
57] tương thích với các siêu kiểu và kiểu con của lớp. Điều này có nghĩa là các tập hợp các thể hiện không đồng nhất với cùng một siêu lớp có thể được sắp xếp
Cũng cần lưu ý rằng bên trong, lớp dữ liệu và lớp dữ liệu hoạt động theo những cách khác nhau. Bạn có thể nghĩ về lớp dữ liệu như biến lớp của bạn thành một loại vật khác [thực tế, nó sử dụng một siêu dữ liệu] và các lớp dữ liệu chỉ đơn thuần là thêm các thứ vào lớp của bạn [không phải vậy]
ví dụ
Những thứ cơ bản
Để định nghĩa một lớp dữ liệu, chỉ cần áp dụng trình trang trí
pip install dataclassy7 cho một định nghĩa lớp [xem bên trên]
Không có đối số cho trình trang trí, lớp kết quả sẽ hoạt động rất giống với lớp tương đương từ mô-đun tích hợp. Tuy nhiên, trình trang trí của dataclassy có một số tùy chọn bổ sung so với dataclasses' và nó cũng được kế thừa để các lớp con của các lớp dữ liệu cũng tự động là các lớp dữ liệu
Trình trang trí tạo ra các phương thức khác nhau cho lớp. Cái nào phụ thuộc chính xác vào các tùy chọn cho người trang trí. Ví dụ:
pip install dataclassy59 sẽ ngăn phương thức
pip install dataclassy6 được tạo.
pip install dataclassy7 tương đương với việc sử dụng trình trang trí với các tham số mặc định [i. e.
pip install dataclassy7 và
pip install dataclassy83 là tương đương]. Các tùy chọn cho trình trang trí được trình bày chi tiết đầy đủ trong phần tiếp theo
Biến lớp
Bạn có thể loại trừ hoàn toàn một thuộc tính lớp khỏi các cơ chế của dataclassy bằng cách chỉ định nghĩa nó mà không cần chú thích kiểu. Điều này có thể được sử dụng cho các biến lớp và hằng số
Sắp xếp lại tham số
dataclassy sửa đổi thứ tự của các trường khi chuyển đổi chúng thành tham số cho
pip install dataclassy3 được tạo. Cụ thể, các trường có giá trị mặc định luôn theo sau những trường không có chúng. Điều này bắt nguồn từ yêu cầu của Python rằng các tham số có đối số mặc định tuân theo các tham số không có chúng. Về mặt khái niệm, bạn có thể nghĩ về quy trình tạo danh sách tham số như thế này
- dataclassy lấy các trường theo thứ tự định nghĩa
- nó chia chúng thành hai danh sách, danh sách đầu tiên là các trường không có giá trị mặc định và danh sách thứ hai là các trường có chúng
- nó nối thêm danh sách thứ hai vào danh sách đầu tiên
Quyết định thiết kế đơn giản này ngăn chặn lỗi
pip install dataclassy85 đáng sợ mà bất kỳ ai đã cố gắng thực hiện kế thừa nghiêm túc bằng cách sử dụng các lớp dữ liệu đều sẽ biết rõ
Bạn có thể xác minh chữ ký của trình khởi tạo được tạo cho bất kỳ lớp nào bằng cách sử dụng
pip install dataclassy86 từ mô-đun
pip install dataclassy87. Ví dụ: sử dụng định nghĩa được liên kết ở trên,
pip install dataclassy88 sẽ trả về
pip install dataclassy89
Nếu sau đó chúng tôi quyết định phân lớp
pip install dataclassy50 để thêm một trường mới,
pip install dataclassy51
pip install dataclassy5
Bạn sẽ thấy rằng
pip install dataclassy52 trả về
pip install dataclassy53
Di sản
Không giống như các lớp dữ liệu, trình trang trí của lớp dữ liệu chỉ cần được áp dụng một lần và tất cả các lớp con sẽ trở thành các lớp dữ liệu với các tùy chọn giống như lớp cha. Trình trang trí vẫn có thể được áp dụng lại cho các lớp con để áp dụng các tham số mới
Để thay đổi loại hoặc thêm hoặc thay đổi giá trị mặc định của một trường trong một lớp con, chỉ cần khai báo lại nó trong lớp con
Xử lý sau khởi tạo
Nếu một trình khởi tạo được yêu cầu [
pip install dataclassy54], dataclassy sẽ tự động đặt các thuộc tính của lớp khi khởi tạo. Bạn có thể xác định mã sẽ chạy sau khi điều này xảy ra - đây được gọi là quá trình xử lý sau khi khởi tạo
Phương thức chứa logic này nên được gọi là
pip install dataclassy11. Giống như với các lớp dữ liệu, nếu
pip install dataclassy56 hoặc lớp không có trường, thì
pip install dataclassy11 sẽ không được gọi
pip install dataclassy5
Trong ví dụ này, khi lớp được khởi tạo với
pip install dataclassy58, trường
pip install dataclassy59 được tính là
pip install dataclassy770
Giống như bất kỳ chức năng nào,
pip install dataclassy11 của bạn cũng có thể nhận các tham số chỉ tồn tại trong ngữ cảnh của
pip install dataclassy11. Chúng có thể được sử dụng cho các đối số của lớp mà bạn không muốn lưu trữ dưới dạng các trường. Một tham số không thể có tên của trường lớp;
Giá trị mặc định
Các giá trị mặc định cho các trường hoạt động chính xác như các đối số mặc định cho các hàm [và trên thực tế, đây là cách chúng được triển khai], với một điểm khác biệt. đối với các giá trị mặc định có thể sao chép, một bản sao được tạo tự động cho từng phiên bản lớp. Điều này có nghĩa là một bản sao mới của trường
pip install dataclassy8
pip install dataclassy774 trong
pip install dataclassy50 ở trên sẽ được tạo mỗi khi nó được khởi tạo, do đó việc thêm vào thuộc tính đó trong một trường hợp sẽ không ảnh hưởng đến các trường hợp khác. "Mặc định có thể sao chép" được định nghĩa là bất kỳ đối tượng nào triển khai phương thức
pip install dataclassy776, bao gồm tất cả các bộ sưu tập có thể thay đổi được tích hợp sẵn [bao gồm cả
pip install dataclassy777]
Nếu bạn muốn tạo các phiên bản mới của các đối tượng không có phương thức
pip install dataclassy776, hãy sử dụng hàm
pip install dataclassy19. Hàm này nhận bất kỳ đối số không nào có thể gọi được. Khi lớp được khởi tạo, khả năng gọi này được thực thi để tạo ra giá trị mặc định cho trường
pip install dataclassy8
API
Người trang trí
pip install dataclassy
00
Trình trang trí được sử dụng để biểu thị rằng một định nghĩa lớp sẽ trở thành một lớp dữ liệu. Trình trang trí trả về một lớp dữ liệu mới với các phương thức được tạo như chi tiết bên dưới. Nếu lớp đã định nghĩa một phương thức cụ thể, nó sẽ không được thay thế bằng phương thức đã tạo
Không có đối số, hành vi của nó, bề ngoài, gần giống với hành vi tương đương của nó trong mô-đun tích hợp. Tuy nhiên, trình trang trí của dataclassy chỉ cần được áp dụng một lần và tất cả các lớp con sẽ trở thành các lớp dữ liệu có cùng tham số. Trình trang trí vẫn có thể được áp dụng lại cho các lớp con để thay đổi tham số
Các trường của lớp dữ liệu được xác định bằng cú pháp chú thích kiểu của Python. Để thay đổi loại hoặc giá trị mặc định của một trường trong một lớp con, chỉ cần khai báo lại nó
Trình trang trí này tận dụng hai tính năng quan trọng không kém được thêm vào trong Python 3. 6. chú thích biến và từ điển được sắp xếp. [Cái sau về mặt kỹ thuật là một chi tiết triển khai của Python 3. 6, chỉ được chuẩn hóa trong Python 3. 7, nhưng là trường hợp cho tất cả các triển khai hiện tại của Python 3. 6, tôi. e. CPython và PyPy. ]
Tùy chọn trang trí
Thuật ngữ "trường", như được sử dụng trong phần này, đề cập đến một biến cấp lớp với chú thích kiểu. Để biết thêm thông tin, hãy xem tài liệu về
pip install dataclassy01 bên dưới
pip install dataclassy02
Nếu đúng [mặc định], hãy tạo một phương thức
pip install dataclassy3 có tham số là tất cả các trường trong chuỗi thừa kế của nó. Chúng được sắp xếp theo thứ tự định nghĩa, với tất cả các trường có giá trị mặc định được đặt ở cuối, theo sau tất cả các trường không có chúng. Phương thức khởi tạo lớp bằng cách áp dụng các tham số này cho lớp dưới dạng thuộc tính. Nếu được xác định, nó cũng sẽ gọi
pip install dataclassy11 với mọi đối số còn lại
Thứ tự này là một sự khác biệt quan trọng so với các lớp dữ liệu, trong đó tất cả các trường được sắp xếp đơn giản theo thứ tự định nghĩa và là thứ cho phép các lớp dữ liệu của lớp dữ liệu linh hoạt hơn nhiều về mặt kế thừa
Một bản sao nông sẽ được tạo cho các đối số có thể thay đổi [được định nghĩa là những đối số xác định phương thức
pip install dataclassy776]. Điều này có nghĩa là các giá trị trường mặc định có thể thay đổi [e. g. một danh sách] sẽ không bị thay đổi giữa các phiên bản
pip install dataclassy51
Nếu đúng [mặc định], hãy tạo một phương thức
pip install dataclassy6 hiển thị tất cả các trường [hoặc nếu
pip install dataclassy5 là đúng, tất cả các trường ngoại trừ các trường bên trong] của thể hiện lớp dữ liệu và các giá trị của chúng
pip install dataclassy09
Nếu đúng [mặc định], hãy tạo phương thức
pip install dataclassy10 để so sánh lớp dữ liệu này với lớp dữ liệu khác cùng loại như thể chúng là các bộ được tạo bởi
pip install dataclassy93, ngoại trừ các trường nội bộ nếu
pip install dataclassy5 là đúng
pip install dataclassy13
Nếu đúng, một phương thức
pip install dataclassy14 được tạo, làm cho lớp có thứ tự. Nếu
pip install dataclassy09 cũng đúng, tất cả các phương pháp so sánh khác cũng được tạo. Các phương thức này so sánh lớp dữ liệu này với một lớp dữ liệu khác cùng loại [hoặc một lớp con] như thể chúng là các bộ được tạo bởi
pip install dataclassy93, ngoại trừ các trường nội bộ nếu
pip install dataclassy5 là đúng. Các quy tắc so sánh từ điển thông thường được áp dụng
pip install dataclassy18
Nếu đúng, hãy buộc tạo một phương thức
pip install dataclassy19 cố gắng băm lớp như thể nó là một bộ các trường có thể băm của nó. Nếu
pip install dataclassy18 là sai, thì
pip install dataclassy19 sẽ chỉ được tạo nếu cả
pip install dataclassy09 và
pip install dataclassy23 đều đúng
pip install dataclassy23
Nếu đúng, các trường hợp trên danh nghĩa là bất biến. các trường không thể bị ghi đè hoặc xóa sau khi khởi tạo trong
pip install dataclassy3. Cố gắng làm như vậy sẽ tăng một
pip install dataclassy52. Cảnh báo. chịu một hình phạt hiệu suất khởi tạo đáng kể
pip install dataclassy5
Nếu đúng [mặc định], các trường nội bộ không được bao gồm trong hàm so sánh
pip install dataclassy6 được tạo [
pip install dataclassy10,
pip install dataclassy14, v.v. ], hoặc
pip install dataclassy31
pip install dataclassy4
Nếu đúng, hãy tạo phương thức
pip install dataclassy31 trả về giá trị của các trường của lớp, theo thứ tự định nghĩa, lưu ý rằng các trường bên trong bị loại trừ khi
pip install dataclassy5 là đúng. Điều này có thể được sử dụng để hủy cấu trúc một thể hiện của lớp dữ liệu, như với Scala
pip install dataclassy35 hoặc Python
pip install dataclassy36
pip install dataclassy1
Nếu đúng, hãy thêm
pip install dataclassy2 vào cuối danh sách tham số cho
pip install dataclassy3. Điều này đơn giản hóa việc khởi tạo lớp dữ liệu từ các từ điển có thể có khóa ngoài các trường của lớp dữ liệu [i. e.
pip install dataclassy40]
pip install dataclassy77
Nếu đúng, hãy tạo thuộc tính
pip install dataclassy0 cho lớp. Điều này làm giảm dung lượng bộ nhớ của các phiên bản và chi phí tra cứu thuộc tính. Tuy nhiên,
pip install dataclassy0 đi kèm với một số hạn chế [ví dụ: đa thừa kế trở nên phức tạp] mà bạn nên biết
pip install dataclassy44
Đặt tham số này để sử dụng siêu dữ liệu khác với dữ liệu của chính lớp dữ liệu. Siêu dữ liệu này phải phân lớp
pip install dataclassy45
pip install dataclassy46 tốt nhất được coi là kém ổn định hơn các phần của thư viện có sẵn trong không gian tên gốc. Chỉ sử dụng siêu dữ liệu tùy chỉnh nếu thực sự cần thiết
Chức năng
pip install dataclassy
47
Lấy một đối số không có thể gọi được và tạo một nhà máy thực thi có thể gọi được này để tạo giá trị mặc định cho trường tại thời điểm khởi tạo lớp
pip install dataclassy
48
Trả về True nếu
pip install dataclassy49 là một lớp dữ liệu như được triển khai trong mô-đun này
pip install dataclassy
50
Trả về True nếu
pip install dataclassy49 là một thể hiện của lớp dữ liệu như được triển khai trong mô-đun này
pip install dataclassy
52
Trả về lệnh của các trường của
pip install dataclassy15 và kiểu của chúng.
pip install dataclassy54 chọn có bao gồm các trường nội bộ hay không.
pip install dataclassy15 có thể là một lớp dữ liệu hoặc một thể hiện của một lớp dữ liệu
Một trường được định nghĩa là một biến cấp lớp với chú thích kiểu. Các biến được định nghĩa trong lớp không có chú thích kiểu được loại trừ hoàn toàn khỏi sự xem xét của dataclassy. Do đó, các biến và hằng của lớp có thể được biểu thị bằng cách không có chú thích kiểu
pip install dataclassy
56
Trả về lệnh của các trường của
pip install dataclassy15 và giá trị của chúng.
pip install dataclassy54 chọn có bao gồm các trường nội bộ hay không.
pip install dataclassy15 phải là một thể hiện của một lớp dữ liệu
pip install dataclassy
60
Tạo đệ quy một lệnh của các trường của thể hiện lớp dữ liệu và các giá trị của chúng
Hàm này được gọi đệ quy trên các lớp dữ liệu, được đặt tên là tuples và iterables
pip install dataclassy
61
Tạo đệ quy một bộ giá trị của các trường của thể hiện lớp dữ liệu, theo thứ tự định nghĩa
Hàm này được gọi đệ quy trên các lớp dữ liệu, được đặt tên là tuples và iterables
pip install dataclassy
62
Tự động tạo một lớp dữ liệu có tên
pip install dataclassy63, trường
pip install dataclassy17, giá trị trường mặc định
pip install dataclassy65 và kế thừa từ
pip install dataclassy66
pip install dataclassy
67
Trả lại một bản sao mới của
pip install dataclassy15 với các giá trị trường được thay thế như được chỉ định trong
pip install dataclassy69
Nhập gợi ý
pip install dataclassy
18
Trình bao bọc loại
pip install dataclassy18 đánh dấu một trường là "nội bộ" đối với lớp dữ liệu. Các trường bắt đầu bằng chỉ báo thành ngữ "sử dụng nội bộ"
pip install dataclassy72 hoặc chỉ báo thông dịch trường riêng tư
pip install dataclassy73 sẽ tự động được coi là trường nội bộ. Do đó, trình bao bọc loại
pip install dataclassy18 phục vụ như một phương pháp thay thế để chỉ ra rằng một trường là nội bộ đối với các tình huống mà bạn không thể đặt tên cho các trường của mình theo cách này
pip install dataclassy
17
Sử dụng
pip install dataclassy17 để bọc chú thích loại của các trường mà bạn muốn đưa vào lớp dữ liệu'
pip install dataclassy19. Giá trị được băm bởi
pip install dataclassy19 bao gồm một bộ thuộc loại của thể hiện, theo sau là bất kỳ trường nào được đánh dấu là
pip install dataclassy17
pip install dataclassy
55
Sử dụng gợi ý loại này để chỉ ra rằng một biến, tham số hoặc trường phải là một thể hiện của lớp dữ liệu chung. Ví dụ: dataclassy sử dụng những chức năng này trong chữ ký của
pip install dataclassy92,
pip install dataclassy93 và
pip install dataclassy12 để chỉ ra rằng các chức năng này nên được gọi trên các thể hiện của lớp dữ liệu
hỗ trợ mypy
Để sử dụng dataclassy trong các dự án với mypy, bạn sẽ cần sử dụng plugin mypy. Bạn có thể tạo một
pip install dataclassy84 hoặc
pip install dataclassy85 cho những dự án như vậy với nội dung như sau