Dataclass có thể có các phương thức Python không?

Nếu bạn mới bắt đầu hoặc đã viết mã bằng Python và thích Lập trình hướng đối tượng nhưng chưa quen với mô-đun dataclasses, bạn đã đến đúng nơi

Trong bài viết này, chúng ta sẽ tìm hiểu

  • Các lớp dữ liệu là gì và lợi ích của chúng là gì
  • Chính xác thì chúng khác với các lớp Python thông thường như thế nào
  • Và khi nào bạn nên sử dụng chúng

Nền lớp dữ liệu

Các lớp dữ liệu được sử dụng chủ yếu để mô hình hóa dữ liệu trong Python. Nó tô điểm cho các lớp Python thông thường và không có giới hạn nào, điều đó có nghĩa là nó có thể hoạt động như một lớp điển hình

Một ví dụ nhỏ về Lớp dữ liệu

from dataclasses import dataclass

@dataclass
class Car:
   color: str
   manufacturer: str
   top_speed_km: int

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

dataclasses đã được giới thiệu trong Python 3. 7 như một phần của PEP 557

Hãy đi sâu vào một số ví dụ mã


Lợi ích của lớp dữ liệu

Triển khai tích hợp các phương pháp đặc biệt

Khi sử dụng trình trang trí @dataclass, chúng tôi không phải tự triển khai, điều này giúp chúng tôi tránh mã soạn sẵn, như phương thức init (_init_ ), phương thức biểu diễn chuỗi (_repr_), các phương thức được sử dụng để sắp xếp đối tượng ( . g. lt, le, gt và ge), những thứ này so sánh lớp như thể nó là một bộ các trường của nó, theo thứ tự.
Đọc thêm về một số phương thức tích hợp sẵn khác trong.

Nó sẽ trông như thế nào với một lớp học thông thường

class Car:
  color: str
  manufacturer: str
  top_speed_km: int

  def  __init__(self, color: str, manufacturer: str, top_speed_km: bool):
    self.color = color
    self.manufacturer = manufacturer
    self.top_speed_km = top_speed_km

  def __lt__(self, other_car):
      return self.top_speed_km < other_car.top_speed_km

red_ferrari = Car(color='red', manufacturer='Ferrari', top_speed_km=320)
print(red_ferrari) # <__main__.Car object at 0x7f218789ca00>
black_ferrari = Car(color='red', manufacturer='Ferrari', top_speed_km=347)
print(red_ferrari < black_ferrari) # True

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Lưu ý hai điểm đó

  • Bởi vì chúng tôi đã không triển khai phương thức đặc biệt _repr_, khi chúng tôi in phiên bản Car, chúng tôi sẽ nhận được tên của lớp và địa chỉ đối tượng
  • Để so sánh giữa 2 phiên bản Ô tô, tôi phải tự triển khai phương thức "nhỏ hơn" (_lt_)

Ví dụ với trình trang trí lớp dữ liệu

from dataclasses import dataclass

@dataclass(order=True)
class Car:
  color: str
  manufacturer: str
  top_speed_km: int

slow_tesla = Car(top_speed_km=261, color='white', manufacturer='Tesla')
print(slow_tesla) # Car(color='white', manufacturer='Tesla', top_speed_km=261)
fast_tesla = Car(top_speed_km=280, color='white', manufacturer='Tesla')
print(slow_tesla < fast_tesla) # True

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Cần phải đặt order=True nếu chúng tôi muốn triển khai các phương thức theo thứ tự đặc biệt được đưa vào lớp dữ liệu (e. g. lt)
  • Khi chúng tôi cố gắng in đối tượng
    class Car:
      color: str
      manufacturer: str
      top_speed_km: int
    
      def  __init__(self, color: str, manufacturer: str, top_speed_km: bool):
        self.color = color
        self.manufacturer = manufacturer
        self.top_speed_km = top_speed_km
    
      def __lt__(self, other_car):
          return self.top_speed_km < other_car.top_speed_km
    
    red_ferrari = Car(color='red', manufacturer='Ferrari', top_speed_km=320)
    print(red_ferrari) # <__main__.Car object at 0x7f218789ca00>
    black_ferrari = Car(color='red', manufacturer='Ferrari', top_speed_km=347)
    print(red_ferrari < black_ferrari) # True
    
    0, chúng tôi thấy các giá trị thực của đối tượng, không phải địa chỉ của đối tượng, không giống như ví dụ trước
  • Chúng ta có thể so sánh hai đối tượng mà không cần chúng ta thực hiện các phương thức đặc biệt

Di sản

Giống như các lớp python thông thường, tính kế thừa cũng có thể là lợi thế của chúng ta ở đây, không cần phải xử lý việc xây dựng lớp cha

from dataclasses import dataclass

@dataclass
class Car:
  color: str
  manufacturer: str
  top_speed_km: int

@dataclass
class ElectricCar(Car):
  battery_capacity_kwh: int
  maximum_range_km: int

white_tesla_model_3 = ElectricCar(color='white', manufacturer='Tesla', top_speed_km=261, battery_capacity_kwh=50, maximum_range_km=455)

print(white_tesla_model_3)
# ElectricCar(color='white', manufacturer='Tesla', top_speed_km=261, battery_capacity_kwh=50, maximum_range_km=455)

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Chỉ để tham khảo, đây là giao diện của nó khi sử dụng một lớp thông thường

class Car:
  color: str
  manufacturer: str
  top_speed_km: int

  def  __init__(self, color: str, manufacturer: str, top_speed_km: int):
    self.color = color
    self.manufacturer = manufacturer
    self.top_speed_km = top_speed_km

class ElectricCar(Car):
  battery_capacity_kwh: int
  maximum_range_km: int

  def __init__(self, color: str, manufacturer: str, top_speed_km: int, battery_capacity_kwh: int, maximum_range_km: int):
      super().__init__(color, manufacturer, top_speed_km)
      self.battery_capacity_kwh = battery_capacity_kwh
      self.maximum_range_km: maximum_range_km

white_tesla_model_3 = ElectricCar(color='white', manufacturer='Tesla', top_speed_km=261, battery_capacity_kwh=50, maximum_range_km=455)
print(white_tesla_model_3)

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Tôi hy vọng bạn có thể thấy rằng chúng tôi đã lưu nhiều mã soạn sẵn ngay cả trong đoạn mã nhỏ này và không lặp lại mọi lần bắt đầu tham số

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

Một lớp dữ liệu đề cập đến một lớp chỉ chứa các trường và phương thức thô để truy cập chúng (getters và setters) . Đây chỉ đơn giản là các thùng chứa dữ liệu được sử dụng bởi các lớp khác. Các lớp này không chứa bất kỳ chức năng bổ sung nào và không thể hoạt động độc lập trên dữ liệu mà chúng sở hữu.

Sự khác biệt giữa DataClass và lớp Python là gì?

Như đã đề cập trước đây, Các lớp dữ liệu Python rất giống với các lớp thông thường, nhưng với các chức năng của lớp được triển khai giúp giảm đáng kể số lượng mã soạn sẵn cần thiết để viết. An example of such boilerplate is the __init__ method.

Khi nào tôi nên sử dụng DataClass trong Python?

Các lớp dữ liệu được sử dụng chủ yếu để mô hình hóa dữ liệu trong Python . Nó tô điểm cho các lớp Python thông thường và không có giới hạn nào, điều đó có nghĩa là nó có thể hoạt động như một lớp điển hình.

Loại DataClass Python là gì?

Lớp dữ liệu là lớp trăn , nhưng phù hợp để lưu trữ các đối tượng dữ liệu. Mô-đun này cung cấp một trình trang trí và các chức năng để tự động thêm các phương thức đặc biệt đã tạo như __init__() và __repr__() vào các lớp do người dùng định nghĩa.