Lớp dữ liệu python thêm thuộc tính

Đôi khi thật thú vị khi chỉ mê mẩn một lúc. Python là một trong những ngôn ngữ kịch bản phổ biến nhất hiện nay và chúng tôi cũng yêu thích nó. Đó là một lý do tại sao LogicMonitor có thể thực thi bất kỳ tập lệnh hoặc ngôn ngữ lập trình nào được môi trường của bạn hỗ trợ. Điều đó có nghĩa là bạn có thể tận hưởng các tính năng mới nhất của ngôn ngữ yêu thích trong công cụ giám sát yêu thích của mình (phải không?). Nếu Python là phó của bạn, hãy cho Python 3. Lớp dữ liệu của 7 hãy thử

Thấu hiểu quá khứ để trân trọng hiện tại

Groovy, một phần mở rộng của Java và PowerShell là hai ngôn ngữ mà tôi tin rằng hỗ trợ mạnh mẽ OOP theo cách thân thiện với người dùng. Chúng cho phép bạn thao tác nhanh các đối tượng tùy chỉnh và báo cáo giá trị của chúng. Python, trong khi cực kỳ phổ biến và mạnh mẽ, bị tụt lại phía sau một chút. Để xem một số ví dụ trước đây, hãy tìm kiếm trên internet về “thuộc tính lớp in Python”. Tại thời điểm của bài viết này, đây là một số kết quả tìm kiếm hàng đầu từ một trong những tài nguyên dành cho nhà phát triển phổ biến nhất, Stack Overflow

Sẽ không tốt hơn nhiều nếu bạn cố gắng tìm kiếm Python 2 chính thức. 7 tài liệu cho các lớp học. Lưu ý mỗi khi các ví dụ của họ in thông tin về các lớp mà họ cho rằng bạn đã biết chính xác những gì bạn muốn hiển thị hoặc bạn sẵn sàng dành thời gian để in rõ ràng từng thuộc tính của lớp?

Dựa trên các kết quả tìm kiếm và câu trả lời, cũng như kinh nghiệm của bản thân, tôi thấy có hai thách thức chính khi làm việc với các đối tượng Python tùy chỉnh

  1. Không có phương pháp cơ bản, được thiết lập tốt để in các thuộc tính lớp. Điều này dẫn đến việc người dùng tạo ra các giải pháp của riêng họ, thường không đầy đủ, dễ vỡ, chậm hoặc phức tạp. Một số câu trả lời về Stack Overflow được chấp nhận vẫn có thể khiến bạn vò đầu bứt tai, ngay cả khi bạn chưa quen với Python
  2. Các giải pháp rõ ràng và hiệu quả để in các thuộc tính lớp, như đã thấy trong các câu trả lời của Stack Overflow, phụ thuộc vào kiến ​​thức về các tính năng Python cụ thể hoặc chi tiết không cần thiết như vars, dir, từ điển nội bộ của đối tượng, định dạng chuỗi hoặc khả năng hiểu danh sách. Mặc dù tất cả những thứ đó đều đáng học, đặc biệt là định dạng chuỗi và hiểu danh sách, nhưng không cần phải có những thứ đó để in các thuộc tính của một lớp đối tượng. Người dùng đã quen với việc sử dụng cú pháp đơn giản print some_variable để hiển thị giá trị của một mục và nó sẽ không khác đối với các lớp

Đối với những người ít hiểu biết về kịch bản, hãy sử dụng phép loại suy để giải thích vấn đề. Hãy hình dung một đối tượng lớp Python như một tờ báo vật lý chứa đầy những câu chuyện. Bạn là người đã in tờ báo này. Bạn đã biết những câu chuyện. Bạn cẩn thận đặt từng đoạn văn, câu chuyện và tiêu đề. Trong các phiên bản Python trước, khi bạn đưa tờ báo cho Python và để kiểm tra độ tỉnh táo, hãy yêu cầu nó đọc cho bạn một trong các bản tin, nó sẽ yêu cầu bạn chỉ định từng đoạn bạn muốn đọc thay vì chỉ đưa cho bạn toàn bộ câu chuyện. Dễ thương khi con bạn nói vậy;

Python bắt đầu trưởng thành

Nở muộn còn hơn không nở

Vào năm 2017, PEP 557 đã khái niệm hóa các Lớp dữ liệu, “tồn tại chủ yếu để lưu trữ các giá trị có thể truy cập được bằng cách tra cứu thuộc tính” và gần một năm sau, việc phát hành Python 3. 7. 0 chính thức cung cấp triển khai. Data Classes cõng tắt gợi ý kiểu (PEP 484) và chú thích kiểu (PEP 526), ​​tương ứng được giới thiệu trong Python 3. 5 và 3. 6. Khi nói đến làm việc với các đối tượng, mọi người mong đợi có thể dự đoán các loại dữ liệu một cách nhất quán. Mặc dù Python vẫn không phải là ngôn ngữ được nhập chính xác, nhưng sự kết hợp giữa gợi ý kiểu và chú thích giúp cả người dùng và IDE biết loại dữ liệu nào sẽ mong đợi khi làm việc thông qua cơ sở mã lớn hơn

Sự Lười Biếng Thúc Đẩy Tự Động Hóa

Một phần khác của sự trưởng thành là trung thực về điều bạn quan tâm và cách dành nhiều thời gian hơn để tập trung vào điều đó. Có thể đó chỉ là tôi, nhưng tôi cảm thấy như DataClass đã bị bán quá mức hoặc ai đó thực sự thích xử lý các quy trình tẻ nhạt. Các từ chính xác từ PEP 557 liên quan đến Lớp dữ liệu là “[…]thực sự không có gì đặc biệt về lớp. trình trang trí thêm các phương thức được tạo vào lớp và trả về cùng một lớp mà nó đã được cung cấp. […] Các lớp dữ liệu giúp bạn không phải viết và duy trì các phương thức này. ”

Những "phương thức được tạo" này là gì? . Giả sử bạn có một lớp Python được định nghĩa như sau

@dataclass
class InventoryItem:
    '''Class for keeping track of an item in inventory.'''
    name: str
    unit_price: float
    quantity_on_hand: int = 0
    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

Do đó, trình trang trí Lớp dữ liệu ("@dataclass"), sẽ tự động tạo mã sau đây cho bạn

def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0) -> None:
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand
def __repr__(self):
    return f'InventoryItem(name={self.name!r}, unit_price={self.unit_price!r}, quantity_on_hand={self.quantity_on_hand!r})'
def __eq__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) == (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented
def __ne__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) != (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented
def __lt__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) < (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented
def __le__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) <= (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented
def __gt__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) > (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented
def __ge__(self, other):
    if other.__class__ is self.__class__:
        return (self.name, self.unit_price, self.quantity_on_hand) >= (other.name, other.unit_price, other.quantity_on_hand)
    return NotImplemented

Ba mươi dòng mã được tạo tự động đó chỉ dành cho ba thuộc tính. tên, đơn_giá và số_lượng. Lý do tại sao tôi tin rằng điều này bị bán quá mức đáng kể là do mức độ nỗ lực để tự tạo và duy trì các phương thức đó trở nên cực kỳ cồng kềnh khi bạn thêm nhiều thuộc tính lớp hơn. Ai cảm thấy thích đối phó với điều đó? . Smith làm nhưng một phần nhờ anh ấy, bạn không cần phải

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

Chúng tôi có thể thấy một số lợi ích của Lớp dữ liệu dựa trên thông tin chúng tôi có cho đến nay

  1. Cải thiện mức độ dễ đọc của mã thông qua định dạng lớp khai báo ngắn gọn hơn
  2. Thiết lập hoặc chia nhỏ nhanh chóng, tự động các phương thức “dunder” (Dấu gạch dưới kép)
    1. Khởi tạo. lưu các giá trị bạn cung cấp cho lớp khi bạn khởi tạo nó
    2. đại diện. những gì bạn sử dụng để in một mô tả chuỗi của lớp và các thuộc tính của nó
    3. Bằng So Sánh
    4. So Sánh Không Bằng
    5. Ít Hơn So Sánh
    6. Nhỏ hơn hoặc bằng so sánh
    7. Lớn Hơn So Sánh
    8. Lớn hơn hoặc bằng so sánh
    9. Đóng băng (bất biến). những gì cho phép bạn thiết lập và nhận các thuộc tính. Với một lớp "đóng băng", các thuộc tính chỉ có thể được cung cấp các giá trị ban đầu. Những giá trị đó không thể được đặt lại sau khi khởi tạo
  3. Lọc nhanh, tự động các thuộc tính có trong biểu diễn chuỗi. Điều này xứng đáng với điểm đầu dòng của riêng nó từ góc độ bảo trì. Khi bạn khai báo các thuộc tính/trường cho lớp, bạn có thể nhanh chóng chỉ định xem có nên đưa nó vào khi in chi tiết lớp hay không. Mặc dù điều này không mang lại bất kỳ lợi ích bảo mật đáng kể nào, nhưng nó giúp bạn giảm bớt sự lộn xộn về hình ảnh mà không làm mất khả năng lưu hoặc xử lý dữ liệu của bạn
  4. Gõ gợi ý và chú thích giúp bạn và IDE của bạn theo dõi phương thức và thuộc tính nào áp dụng cho các biến của bạn ngay cả khi bạn bắt đầu thêm các lớp trừu tượng. Điều này đặc biệt hữu ích nếu bạn là con người giống như chúng tôi và sử dụng tính năng tự động hoàn thành mã
  5. Cách tiêu chuẩn, ngắn gọn để in một lớp và các thuộc tính của nó bằng cách sử dụng câu lệnh in.
    print some_variable

Cảnh báo lớp dữ liệu

Theo PEP 557, Các lớp dữ liệu không có nghĩa là thay thế hoàn toàn bất kỳ thư viện Python nào khác. Hơn nữa, bài báo PEP nói rằng các Lớp dữ liệu không phù hợp khi

  • Cần có khả năng tương thích API với bộ dữ liệu hoặc ký hiệu
  • Bắt buộc phải xác thực loại ngoài giá trị do PEP 484 và 526 cung cấp hoặc bắt buộc phải xác thực hoặc chuyển đổi giá trị

Sự kết luận

Lớp dữ liệu Python kết hợp các tính năng Python hiện có thành một cú pháp khai báo, ngắn gọn để mang lại cho người dùng trải nghiệm được cải thiện khi quản lý các lớp được sử dụng chủ yếu để lưu trữ dữ liệu. Một trong những lợi ích chính của Lớp dữ liệu Python là bạn có thể nhanh chóng in các biểu diễn chuỗi của các lớp và thuộc tính của chúng. Do khả năng mở rộng mạnh mẽ của LogicMonitor, bạn có thể tận dụng các Lớp dữ liệu Python trong số tất cả các tính năng Python mới nhất khác trong quá trình giám sát và quản trị cổng thông tin của mình

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.

Tôi có nên luôn sử dụng Dataclass không?

Kết luận. dataclasses là một mô-đun mạnh mẽ giúp chúng tôi, những nhà phát triển Python, mô hình hóa dữ liệu của chúng tôi, tránh viết mã soạn sẵn và viết mã đẹp và sạch hơn nhiều . Tôi khuyến khích bạn khám phá và tìm hiểu thêm về các tính năng đặc biệt của lớp dữ liệu, tôi sử dụng nó trong tất cả các dự án của mình và tôi khuyên bạn cũng nên làm như vậy.

__ Post_init __ Python là gì?

Phương thức __post_init__ được gọi ngay sau khi khởi tạo . Nói cách khác, nó được gọi sau khi đối tượng nhận được các giá trị cho các trường của nó, chẳng hạn như tên, lục địa, dân số và chính thức_lang.

@dataclass trong Python là gì?

Lớp dữ liệu là các lớp python, 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.