Trình trang trí thuộc tính lớp dữ liệu Python

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ệu

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]
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]
7

Hã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ông

Chú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]
2

Bâ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]
5

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]

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ày

Hơ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]
7

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]
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ày

Lớp dữ liệu đông lạnh

Vì 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ại

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"

Đ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ến

Tính chất

Hã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ường

Bà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ất

Phươ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 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]
6

Lư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 nhau

Và 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

Trình trang trí Dataclass trong Python là gì?

Hàm này là trình trang trí được sử dụng để thêm các phương thức đặc biệt đã tạo vào các lớp , như được mô tả bên dưới. Trình trang trí dataclass[] kiểm tra lớp để tìm trường s. Một trường được định nghĩa là một biến lớp có chú thích kiểu.

Lớp dữ liệu Python có thể có các phương thức không?

các lớp dữ liệu có một phương thức đặc biệt được gọi là __post_init__ . Đúng như tên gọi, phương thức này được gọi ngay sau khi phương thức __init__ được gọi. Quay trở lại ví dụ trước, chúng ta có thể thấy phương thức này có thể được gọi như thế nào để khởi tạo một thuộc tính bên trong phụ thuộc vào các thuộc tính đã đặt trước đó.

Liệu Python 3. 6 có Dataclass không?

Lớp dữ liệu, được giới thiệu trong Python 3. 7 [và được nhập ngược vào Python 3. 6] , cung cấp một cách thuận tiện để làm cho các lớp học bớt dài dòng hơn. Nhiều điều thông thường bạn làm trong một lớp, chẳng hạn như khởi tạo các thuộc tính từ các đối số được truyền cho lớp, có thể được rút gọn thành một vài hướng dẫn cơ bản.

Dataclass có thể kế thừa từ một lớp bình thường không?

Khi một DataClass kế thừa một lớp thông thường , __init__[] từ siêu lớp sẽ bị ghi đè trong lớp con. tác giả trong GfgArticle ghi đè tương tự trong Article – Là khái niệm cơ bản về thừa kế, giá trị cho phép gán của nó trước tiên được tìm trong lớp con và theo dõi cây trong siêu lớp.

Chủ Đề