Trong một bài viết trước, tôi đã giới thiệu về Python decorators. Hôm nay chúng ta sẽ xem xét kỹ hơn một số công cụ trang trí tích hợp sẵn — đặc biệt là những công cụ trang trí có thể được sử dụng cho chủ đề rộng lớn là “quản lý dữ liệu”. Bằng cách này, ý tôi là các lớp được thiết kế để chứa và lưu trữ dữ liệu [
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
3], cũng như đơn giản hóa việc truy cập thuộc tính bằng cách áp dụng kiểu lập trình hướng đối tượng [OOP] trong Python [from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
4]lớp dữ liệuTrình trang trí
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5 trong Python trang bị cho một lớp chức năng của trình trợ giúp xung quanh việc lưu trữ dữ liệu — chẳng hạn như tự động thêm một hàm tạo, nạp chồng toán tử from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
6 và hàm from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
7Hãy bắt đầu với một ví dụ. Chúng tôi sẽ nghĩ ra một lớp đơn giản lưu trữ nhân viên của một công ty. Chúng có tên, mức lương cũng như thuộc tính mô tả số năm họ đã làm việc cho công ty
Trong Python thông thường, bạn có thể sẽ triển khai điều này dọc theo các dòng mã sau
class Employee:
def __init__[self, name: str, salary: int, years_with_company: int = 0]:
self.name = name
self.salary = salary
self.years_with_company = years_with_company
def __eq__[self, other: "Employee"]:
return [self.name == other.name and self.salary == other.salary and self.years_with_company == other.years_with_company]
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
Đoạn mã trên triển khai một lớp với các thuộc tính được mô tả trước đó, cũng như nạp chồng toán tử bằng [
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
6]. nếu không có điều này, việc kiểm tra from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
0 sẽ không thành công, vì Python không biết cách so sánh lớp cụ thể này một cách có ý nghĩa và quay lại kiểm tra xem hai phiên bản có phải là cùng một đối tượng hay khôngChúng tôi lưu ý thêm rằng biểu diễn chuỗi [
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
1] không cung cấp cho chúng tôi nhiều, và thay vào đó chỉ in một cái gì đó tương tự như from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
2Bây giờ, hãy để Python thực hiện công việc của chúng ta bằng cách trang trí lớp của chúng ta với trình trang trí
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
Việc sử dụng trình trang trí này đã khiến Python tự động triển khai một hàm tạo cho chúng tôi, hoạt động giống hệt với những gì chúng tôi đã triển khai trước đó. nó gán các thuộc tính thể hiện theo các đối số đã truyền và cũng có thể xử lý các đối số tùy chọn
Tiếp theo, trong một
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5, toán tử bằng đã được ghi đè để kiểm tra tính bằng nhau của tất cả các thuộc tính lớp, giống với những gì chúng tôi đã triển khai thủ công ở trên — trả về chính xác from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5 trong lần kiểm tra bằng nàyHơn nữa, biểu diễn chuỗi của thể hiện lớp bây giờ trông đẹp hơn nhiều [i. e.
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
6 đã được ghi đè một cách có ý nghĩa], mang lại. from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
7Trình trang trí
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5 thậm chí còn làm được nhiều hơn thế — nhưng hiện tại chúng ta sẽ tập trung vào ba hiệu ứng có lẽ được sử dụng phổ biến nhất nàyLớp dữ liệu đông lạnhVì các bộ trang trí thực sự là các hàm, nên chúng cũng có thể nhận các đối số.
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
9 là một trong những lập luận có thể xảy ra ở đây. Nó chỉ ra rằng không thể sửa đổi from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
5 sau khi xây dựng. Cụ thể, những điều sau đây sẽ thất bạifrom dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
Điều này có ý nghĩa trong rất nhiều tình huống. Ví dụ:
from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
1 được sử dụng để đại diện hoàn toàn cho các tập dữ liệu bất biếnTính chấtHãy hoàn nguyên thay đổi
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
9 ở trên và thay vào đó thực hiện kiểm soát truy cập chi tiết hơn — để triển khai tổng thể cách truy cập thuộc tính phiên bản thông thườngBài đăng này sẽ không phải là phần giới thiệu về OOP, nhưng ngắn gọn. chúng tôi không bao giờ muốn hiển thị trực tiếp các thuộc tính cá thể. Thay vào đó, chúng ta sẽ phân chia các hàm/biến một cách có ý nghĩa thành
from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
3, from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
4 hoặc from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
5 [có lẽ tôi đang chuyển hướng sang C++, nhưng chỉ có thế thôi] và hiển thị các biến công khai thông qua các phương thức getter và setter - tóm lại là. tính chấtPhương thức getter sẽ chịu trách nhiệm trả về giá trị của biến và setter được sử dụng để thiết lập nó. Điều này giúp kiểm soát tốt hơn các biến [ví dụ: chúng tôi không muốn cho phép đặt ước số thành 0]
Lần này, tôi sẽ bỏ qua ví dụ tẻ nhạt về triển khai getter/setter và thay vào đó, tôi sẽ trực tiếp hiển thị giải pháp bằng cách sử dụng trình trang trí
from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
6 của Pythonfrom dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
6Lưu ý việc đổi tên các biến. Chúng tôi hiện đang sử dụng dấu gạch dưới hàng đầu [
from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
7]. theo quy ước Python. Biến này được hiểu là from dataclasses import dataclass
@dataclass[frozen=True]
class Employee:
name: str
salary: int
years_with_company: int = 0
employee = Employee["First", 80000]
employee.name = "Test"
5 — có nghĩa là bạn không nên truy cập trực tiếp vào nóNgoài ra, hãy lưu ý cách sử dụng
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
4 và from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
60 cộng với các hàm trang trí để xác định getter và setter và sau đó, from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
61 có thể được sử dụng như bất kỳ biến nào khác [trong ví dụ này, chúng tôi giả sử một bộ phận nhân sự hào phóng, chỉ cho phép tăng lương]. Chúng tôi tiếp tục bỏ qua việc triển khai setter cho from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
62, biến biến này thành chỉ đọc [một lần nữa, không phải là một giả định siêu thực tế, mặc dù tên có thể thay đổi trong tương lai]Lưu ý rằng tôi đã không triển khai những thứ tương tự cho
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: int
years_with_company: int = 0
first_employee = Employee["First", 80000]
second_employee = Employee["First", 80000]
print[first_employee]
print[first_employee == second_employee]
63, nhưng nó sẽ trông giống hệt nhauVà như vậy chúng ta kết thúc chủ đề “quản lý dữ liệu”. Cảm ơn bạn đã theo dõi và hy vọng sẽ sớm gặp lại bạn trong một bài viết khác