Hướng dẫn convert data class to dict python - chuyển đổi lớp dữ liệu thành dict python
Đối với tốc độ thuần khiết, không thay đổi và hiệu quả vô biên, các loại thậm chí có thể khiến những người như Chuck Norris tạm dừng và bất lực nhìn vào sự sợ hãi, tôi khiêm tốn đề xuất cách tiếp cận được lên kế hoạch tốt này với 2:pure, unadulterated speed and boundless efficiency, the kinds of which could even cause the likes of Chuck Norris to take pause and helplessly look on in awe, I humbly recommend this remarkably well planned-out approach with 2: Show
Đối với một lớp xác định thuộc tính 3, chẳng hạn như với 4, cách tiếp cận trên rất có thể sẽ không hoạt động, vì thuộc tính 2 sẽ không có sẵn trên các trường hợp lớp. Trong trường hợp đó, một cách tiếp cận "bắn cho mặt trăng" hiệu quả cao như dưới đây có thể là khả thi: 3 attribute, such as with 4, the above approach most likely won't work, as the 2
attribute won't be available on class instances. In that case, a highly efficient "shoot for the moon" approach such as below could instead be viable:
Trong trường hợp bất kỳ ai đang ở rìa ghế của họ ngay bây giờ (tôi biết, điều này thực sự đáng kinh ngạc, những thứ đột phá) - Tôi đã thêm thời gian cá nhân của mình thông qua mô -đun 6 bên dưới, hy vọng sẽ làm sáng tỏ hơn một chút trong Khía cạnh hiệu suất của mọi thứ.FYI, các cách tiếp cận với 2 thuần túy chắc chắn nhanh hơn nhiều so với 8.
Kết quả trên máy tính xách tay Mac M1 của tôi: Mã nguồn: lib/dataclasses.py Lib/dataclasses.py Mô-đun này cung cấp một bộ trang trí và chức năng để tự động thêm các phương thức đặc biệt được tạo như from dataclasses import dataclass @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_hand3 và from dataclasses import dataclass @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_hand4 vào các lớp do người dùng xác định. Nó ban đầu được mô tả trong PEP 557.special methods such as from dataclasses import dataclass @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_hand3 and from dataclasses import dataclass @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_hand4 to user-defined classes. It was originally described in PEP 557. Các biến thành viên để sử dụng trong các phương thức được tạo này được xác định bằng cách sử dụng các chú thích loại PEP 526. Ví dụ: mã này:PEP 526 type annotations. For example, this code: from dataclasses import dataclass @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 Sẽ thêm, trong số những thứ khác, một from dataclasses import dataclass @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_hand3 trông giống như: def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0): self.name = name self.unit_price = unit_price self.quantity_on_hand = quantity_on_hand Lưu ý rằng phương pháp này được tự động thêm vào lớp: nó không được chỉ định trực tiếp trong định nghĩa from dataclasses import dataclass @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_hand6 được hiển thị ở trên. Mới trong phiên bản 3.7. Nội dung mô -đun@dataclasses.dataclass (*, init = true, repr = true, eq = true, order = false, unsafe_hash = false, frozen = false, match_args = truedataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)¶Hàm này là một nhà trang trí được sử dụng để thêm các phương pháp đặc biệt được tạo vào các lớp, như được mô tả dưới đây.decorator that is used to add generated special methods to classes, as described below. Người trang trí from dataclasses import dataclass @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_hand7 kiểm tra lớp học để tìm from dataclasses import dataclass @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_hand8s. Một from dataclasses import dataclass @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_hand8 được định nghĩa là một biến lớp có chú thích loại. Với hai trường hợp ngoại lệ được mô tả dưới đây, không có gì trong from dataclasses import dataclass @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_hand7 kiểm tra loại được chỉ định trong chú thích biến.type annotation. With two exceptions described below, nothing in from dataclasses import dataclass @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_hand7 examines the type specified in the variable annotation. Thứ tự của các trường trong tất cả các phương thức được tạo là thứ tự chúng xuất hiện trong định nghĩa lớp. Nhà trang trí from dataclasses import dataclass @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_hand7 sẽ thêm các phương pháp khác nhau của Dunder vào lớp, được mô tả dưới đây. Nếu bất kỳ phương thức được thêm nào đã tồn tại trong lớp, hành vi phụ thuộc vào tham số, như được ghi lại dưới đây. Người trang trí trả lại cùng một lớp mà nó được gọi trên; Không có lớp mới được tạo ra. Nếu from dataclasses import dataclass @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_hand7 được sử dụng như một trình trang trí đơn giản không có tham số, nó hoạt động như thể nó có các giá trị mặc định được ghi lại trong chữ ký này. Đó là, ba cách sử dụng from dataclasses import dataclass @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_hand7 này tương đương: @dataclass class C: ... @dataclass() class C: ... @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) class C: ... Các tham số đến from dataclasses import dataclass @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_hand7 là:
from dataclasses import dataclass @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_hand8S có thể tùy ý chỉ định giá trị mặc định, sử dụng cú pháp Python bình thường: @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b' Trong ví dụ này, cả 51 và 52 sẽ được bao gồm trong phương thức from dataclasses import dataclass @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_hand3 được thêm vào, sẽ được định nghĩa là: def __init__(self, a: int, b: int = 0): @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 sẽ được nâng lên nếu một trường không có giá trị mặc định theo trường có giá trị mặc định. Điều này đúng cho dù điều này xảy ra trong một lớp duy nhất, hoặc là kết quả của kế thừa lớp học. dataClasses.field (*, mặc định = thiếu, default_factory = thiếu, init = true, repr = true, hash = none, so sánh = true, metadata = none, kw_only = thiếu)field(*, default=MISSING, default_factory=MISSING, init=True, repr=True, hash=None, compare=True, metadata=None, kw_only=MISSING)¶ Đối với các trường hợp sử dụng thông thường và đơn giản, không có chức năng nào khác là bắt buộc. Tuy nhiên, có một số tính năng DataClass yêu cầu thêm thông tin trên mỗi trường. Để đáp ứng nhu cầu này để biết thêm thông tin, bạn có thể thay thế giá trị trường mặc định bằng một cuộc gọi đến hàm 55 được cung cấp. Ví dụ:@dataclass class C: mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3] Như được hiển thị ở trên, giá trị 56 là đối tượng Sentinel được sử dụng để phát hiện nếu một số tham số được cung cấp bởi người dùng. Sentinel này được sử dụng vì @dataclass class C: mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3]7 là một giá trị hợp lệ cho một số tham số có ý nghĩa riêng biệt. Không có mã nào nên trực tiếp sử dụng giá trị 56.Các tham số đến 55 là:
Nếu giá trị mặc định của trường được chỉ định bởi một cuộc gọi đến 55, thì thuộc tính lớp cho trường này sẽ được thay thế bằng giá trị 60 được chỉ định. Nếu không có 60 được cung cấp, thì thuộc tính lớp sẽ bị xóa. Mục đích là sau khi trình trang trí from dataclasses import dataclass @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_hand7 chạy, các thuộc tính lớp đều sẽ chứa các giá trị mặc định cho các trường, giống như chính giá trị mặc định được chỉ định. Ví dụ, sau: 0Thuộc tính lớp 89 sẽ là 90, thuộc tính lớp 91 sẽ là 92 và các thuộc tính lớp 93 và 94 sẽ không được đặt.
classdataclasses.field¶dataclasses.Field¶ 82 Các đối tượng mô tả từng trường được xác định. Các đối tượng này được tạo bên trong và được trả về bằng phương pháp cấp độ mô-đun 44 (xem bên dưới). Người dùng không bao giờ nên khởi tạo trực tiếp đối tượng 82. Các thuộc tính được ghi lại của nó là:
Các thuộc tính khác có thể tồn tại, nhưng chúng là riêng tư và không được kiểm tra hoặc dựa vào. DataClasses.fields (class_or_instance) ¶fields(class_or_instance)¶Trả về một tuple của các đối tượng 82 xác định các trường cho dữ liệu này. Chấp nhận một dữ liệu hoặc một thể hiện của một DataClass. Tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 nếu không được thông qua một dữ liệu hoặc thể hiện của một. Không trả lại các trường giả là 11 hoặc 12. dataClasses.asdict (obj, *, dict_factory = dict) ¶asdict(obj,
*, dict_factory=dict)¶Chuyển đổi DataClass 13 thành Dict (bằng cách sử dụng hàm nhà máy 14). Mỗi DataClass được chuyển đổi thành một mô tả của các trường của nó, dưới dạng các cặp 15. DataClasses, dicts, danh sách và bộ dữ liệu được đệ quy vào. Các đối tượng khác được sao chép với 16.Ví dụ về việc sử dụng 17 trên các dữ liệu lồng nhau: 1Để tạo một bản sao nông, cách giải quyết sau đây có thể được sử dụng: 2 17 tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 nếu 13 không phải là một thể hiện dữ liệu. dataclasses.astuple (obj, *, tuple_factory = tuple) ¶astuple(obj,
*, tuple_factory=tuple)¶Chuyển đổi DataClass 13 thành Tuple (bằng cách sử dụng hàm nhà máy 22). Mỗi DataClass được chuyển đổi thành một bộ của các giá trị trường của nó. DataClasses, dicts, danh sách và bộ dữ liệu được đệ quy vào. Các đối tượng khác được sao chép với 16.Tiếp tục từ ví dụ trước: 3Để tạo một bản sao nông, cách giải quyết sau đây có thể được sử dụng: 4 17 tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 nếu 13 không phải là một thể hiện dữ liệu. dataclasses.astuple (obj, *, tuple_factory = tuple) ¶make_dataclass(cls_name, fields, *,
bases=(), namespace=None, init=True, repr=True, eq=True,
order=False, unsafe_hash=False, frozen=False, match_args=True,
kw_only=False, slots=False, weakref_slot=False)¶Chuyển đổi DataClass 13 thành Tuple (bằng cách sử dụng hàm nhà máy 22). Mỗi DataClass được chuyển đổi thành một bộ của các giá trị trường của nó. DataClasses, dicts, danh sách và bộ dữ liệu được đệ quy vào. Các đối tượng khác được sao chép với 16.Tiếp tục từ ví dụ trước: 5 24 tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 nếu 13 không phải là một thể hiện dữ liệu. 6 dataclasses.make_dataclass (cls_name, trường, *, bases = (), không gian tên = none, init = true, repr = true, eq = true , slots = false, feadref_slot = false) ¶replace(obj, /,
**changes)¶Tạo một dữ liệu mới với tên 27, các trường như được định nghĩa trong 28, các lớp cơ sở như được đưa ra trong 29 và khởi tạo bằng một không gian tên như được đưa ra trong 30. 28 là một yếu tố có thể có các phần tử là 98, 33 hoặc 34. Nếu chỉ 98 được cung cấp, 36 được sử dụng cho 99. Các giá trị của def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0): self.name = name self.unit_price = unit_price self.quantity_on_hand = quantity_on_hand5, def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0): self.name = name self.unit_price = unit_price self.quantity_on_hand = quantity_on_hand8, @dataclass class C: ... @dataclass() class C: ... @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) class C: ...2, @dataclass class C: ... @dataclass() class C: ... @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) class C: ...5, @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'9, def __init__(self, a: int, b: int = 0):3, 24, 31, 36 và 46 có ý nghĩa tương tự như chúng trong from dataclasses import dataclass @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_hand7. Chức năng này không được yêu cầu nghiêm ngặt, bởi vì bất kỳ cơ chế Python nào để tạo một lớp mới với 49 sau đó có thể áp dụng hàm from dataclasses import dataclass @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_hand7 để chuyển đổi lớp đó thành DataClass. Hàm này được cung cấp như một sự tiện lợi. Ví dụ: Tương đương với: DataClasses.Replace (obj, /, ** thay đổi) ¶ Tạo một đối tượng mới cùng loại với 13, thay thế các trường bằng các giá trị từ 52. Nếu 13 không phải là một lớp dữ liệu, hãy tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8. Nếu các giá trị trong 52 không chỉ định các trường, tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8. Đối tượng mới được trả về được tạo bằng cách gọi phương thức from dataclasses import dataclass @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_hand3 của DataClass. Điều này đảm bảo rằng 58, nếu có, cũng được gọi.is_dataclass(obj)¶Các biến chỉ dành cho ban đầu không có giá trị mặc định, nếu có, phải được chỉ định trong cuộc gọi đến 59 để chúng có thể được chuyển đến from dataclasses import dataclass @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_hand3 và 58.Đó là một lỗi cho 52 để chứa bất kỳ trường nào được xác định là có 63. Một @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'3 sẽ được nêu ra trong trường hợp này. 7 Được báo trước về cách các lĩnh vực 63 hoạt động trong một cuộc gọi đến 59. Chúng không được sao chép từ đối tượng nguồn, mà được khởi tạo trong 58, nếu chúng được khởi tạo. Dự kiến các lĩnh vực 63 sẽ hiếm khi được sử dụng một cách thận trọng và thận trọng. Nếu chúng được sử dụng, có thể là khôn ngoan khi có các hàm tạo lớp thay thế hoặc có lẽ là phương thức 59 (hoặc được đặt tên tương tự) tùy chỉnh để xử lý việc sao chép phiên bản.MISSING¶dataclasses.is_dataclass (obj) ¶ Trả về 25 Nếu tham số của nó là một dữ liệu hoặc một thể hiện của một, nếu không hãy trả về @dataclass class C: ... @dataclass() class C: ... @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False) class C: ...6.KW_ONLY¶ Nếu bạn cần biết liệu một lớp có phải là một thể hiện của một dữ liệu (và không phải là chính dữ liệu), thì hãy thêm kiểm tra thêm cho 72:Trong ví dụ này, các trường 78 và 79 sẽ được đánh dấu là các trường chỉ từ khóa: 8Trong một DataClass duy nhất, đó là một lỗi để chỉ định nhiều hơn một trường có loại là 35.Mới trong phiên bản 3.10. ExceptionDataClass.FrozenInstanceError¶dataclasses.FrozenInstanceError¶Lớn lên khi một 21 hoặc 22 được xác định ngầm được gọi trên một dữ liệu được xác định với 83. Nó là một lớp con của 84.Xử lý sau khi khởi độngMã from dataclasses import dataclass @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_hand3 được tạo sẽ gọi một phương thức có tên 58, nếu 58 được xác định trên lớp. Nó thường sẽ được gọi là 88. Tuy nhiên, nếu bất kỳ trường 12 nào được xác định, chúng cũng sẽ được chuyển đến 58 theo thứ tự chúng được xác định trong lớp. Nếu không có phương thức from dataclasses import dataclass @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_hand3 được tạo, thì 58 sẽ không được gọi tự động.Trong số các mục đích sử dụng khác, điều này cho phép khởi tạo các giá trị trường phụ thuộc vào một hoặc nhiều trường khác. Ví dụ: 9Phương pháp from dataclasses import dataclass @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_hand3 được tạo bởi from dataclasses import dataclass @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_hand7 không gọi các phương thức lớp cơ sở from dataclasses import dataclass @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_hand3. Nếu lớp cơ sở có phương thức from dataclasses import dataclass @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_hand3 phải được gọi, thì thông thường gọi phương thức này theo phương thức 58: 0Tuy nhiên, lưu ý rằng nói chung, các phương thức from dataclasses import dataclass @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_hand3 do DataClass tạo ra không cần phải gọi, vì DataClass dẫn xuất sẽ chăm sóc việc khởi tạo tất cả các trường của bất kỳ lớp cơ sở nào là chính dữ liệu. Xem phần bên dưới trên các biến chỉ dành cho init để biết các cách để chuyển các tham số sang 58. Cũng xem cảnh báo về cách 59 xử lý các trường 63.Biến lớpMột trong hai nơi from dataclasses import dataclass @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_hand7 thực sự kiểm tra loại trường là xác định xem một trường có phải là biến lớp như được định nghĩa trong PEP 526 hay không. Nó làm điều này bằng cách kiểm tra xem loại trường là 03. Nếu một trường là một 11, nó sẽ bị loại trừ khỏi việc xem xét như một trường và bị bỏ qua bởi các cơ chế dữ liệu. Các trường giả 11 như vậy không được trả về bởi hàm 44 ở cấp độ mô-đun.PEP 526. It does this by checking if the type of the field is 03. If a field is a 11, it is excluded from consideration as a field and is ignored by the dataclass mechanisms. Such 11 pseudo-fields are not returned by the module-level 44
function.Biến chỉ khởi độngNơi khác mà from dataclasses import dataclass @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_hand7 kiểm tra chú thích loại là để xác định xem một trường có phải là biến chỉ dành cho ban đầu hay không. Nó làm điều này bằng cách xem liệu loại trường thuộc loại 08. Nếu một trường là một 12, nó được coi là một trường giả được gọi là một trường chỉ dành cho người khởi động. Vì nó không phải là một trường thực sự, nó không được trả về bởi hàm 44 ở cấp độ mô-đun. Các trường chỉ dành cho init được thêm vào làm tham số vào phương thức from dataclasses import dataclass @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_hand3 được tạo và được chuyển sang phương thức 58 tùy chọn. Chúng không được sử dụng bởi các dữ liệu.Ví dụ: giả sử một trường sẽ được khởi tạo từ cơ sở dữ liệu, nếu một giá trị không được cung cấp khi tạo lớp: 1Trong trường hợp này, 44 sẽ trả về 82 Đối tượng cho 15 và 16, nhưng không phải cho 17.Các trường hợp đóng băngKhông thể tạo ra các đối tượng Python thực sự bất biến. Tuy nhiên, bằng cách chuyển 83 cho người trang trí from dataclasses import dataclass @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_hand7, bạn có thể mô phỏng tính bất biến. Trong trường hợp đó, DataClasses sẽ thêm các phương thức 21 và 22 vào lớp. Các phương pháp này sẽ tăng 22 khi được gọi.Có một hình phạt hiệu suất nhỏ khi sử dụng 83: from dataclasses import dataclass @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_hand3 không thể sử dụng gán đơn giản để khởi tạo các trường và phải sử dụng 25.Di sản¶Khi DataClass được tạo bởi trình trang trí from dataclasses import dataclass @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_hand7, nó sẽ xem qua tất cả các lớp cơ sở của lớp trong MRO ngược (nghĩa là bắt đầu từ ____118) và, đối với mỗi dữ liệu mà nó tìm thấy, thêm các trường từ lớp cơ sở đó vào một lớp lập bản đồ các lĩnh vực. Sau khi tất cả các trường lớp cơ sở được thêm vào, nó sẽ thêm các trường riêng vào ánh xạ được đặt hàng. Tất cả các phương thức được tạo sẽ sử dụng ánh xạ kết hợp, được tính toán của các trường. Bởi vì các trường theo thứ tự chèn, các lớp dẫn xuất ghi đè các lớp cơ sở. Một ví dụ: 2Danh sách cuối cùng của các trường là, theo thứ tự, 28, 78, 79. Loại cuối cùng của 28 là 32, như được chỉ định trong lớp 33.Phương thức from dataclasses import dataclass @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_hand3 được tạo cho 33 sẽ trông giống như:
3Đặt hàng lại các tham số chỉ từ khóa trong ________ 43¶Sau khi các tham số cần thiết cho from dataclasses import dataclass @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_hand3 được tính toán, bất kỳ tham số chỉ từ khóa nào cũng được di chuyển đến sau tất cả các tham số thông thường (không chỉ KEYWORD). Đây là một yêu cầu về cách thực hiện các tham số chỉ từ khóa trong Python: chúng phải đến sau các tham số không chỉ dành cho Keyword. Trong ví dụ này, 38, 39 và 40 là các trường chỉ có từ khóa và 41 và 42 là các trường thường xuyên: 4Phương thức from dataclasses import dataclass @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_hand3 được tạo cho 44 sẽ trông giống như: 5Lưu ý rằng các tham số đã được đặt hàng lại từ cách chúng xuất hiện trong danh sách các trường: các tham số có nguồn gốc từ các trường thông thường được theo sau bởi các tham số có nguồn gốc từ các trường chỉ từ khóa. Thứ tự tương đối của các tham số chỉ từ khóa được duy trì trong danh sách tham số from dataclasses import dataclass @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_hand3 được đặt hàng lại. Các chức năng nhà máy mặc địnhNếu 55 chỉ định 62, nó được gọi bằng không đối số khi cần giá trị mặc định cho trường. Ví dụ: để tạo một thể hiện mới của danh sách, sử dụng: 6Nếu một trường được loại trừ khỏi from dataclasses import dataclass @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_hand3 (sử dụng 63) và trường cũng chỉ định 62, thì hàm nhà máy mặc định sẽ luôn được gọi từ hàm from dataclasses import dataclass @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_hand3 được tạo. Điều này xảy ra bởi vì không có cách nào khác để cung cấp cho trường một giá trị ban đầu. Giá trị mặc định có thể thay đổiPython lưu trữ các giá trị biến thành viên mặc định trong các thuộc tính lớp. Hãy xem xét ví dụ này, không sử dụng DataClasses: 7Lưu ý rằng hai trường hợp của lớp 33 chia sẻ cùng một biến lớp 28, như mong đợi.Sử dụng DataClasses, nếu mã này hợp lệ: 8Nó sẽ tạo mã tương tự như: 9Điều này có vấn đề tương tự như ví dụ ban đầu sử dụng lớp 33. Nghĩa là, hai trường hợp của lớp 44 không chỉ định giá trị cho 28 khi tạo một thể hiện lớp sẽ chia sẻ cùng một bản sao của 28. Bởi vì DataClass chỉ sử dụng tạo lớp Python bình thường, họ cũng chia sẻ hành vi này. Không có cách nào chung cho các lớp dữ liệu để phát hiện điều kiện này. Thay vào đó, người trang trí from dataclasses import dataclass @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_hand7 sẽ tăng @dataclass class C: a: int # 'a' has no default value b: int = 0 # assign a default value for 'b'8 nếu nó phát hiện một tham số mặc định không thể đo lường được. Giả định là nếu một giá trị là không thể không thể thay đổi được. Đây là một giải pháp một phần, nhưng nó bảo vệ chống lại nhiều lỗi phổ biến. Sử dụng các hàm nhà máy mặc định là một cách để tạo các phiên bản mới của các loại có thể thay đổi làm giá trị mặc định cho các trường: 0Đã thay đổi trong phiên bản 3.11: Thay vì tìm kiếm và loại bỏ các đối tượng thuộc loại 60, 61, or 62, unhashable objects are now not allowed as default values. Unhashability is used to approximate mutability.Các lĩnh vực mô tả kiểuCác trường được gán các đối tượng mô tả vì giá trị mặc định của chúng có các hành vi đặc biệt sau:descriptor objects as their default value have the following special behaviors:
1Lưu ý rằng nếu một trường được chú thích bằng loại mô tả, nhưng không được gán một đối tượng mô tả là giá trị mặc định của nó, trường sẽ hoạt động như một trường bình thường. Làm cách nào để biến một lớp học thành một từ điển trong Python?Bằng cách sử dụng thuộc tính __dict__ trên một đối tượng của một lớp và đạt được từ điển. Tất cả các đối tượng trong Python có một thuộc tính __dict__, là một đối tượng từ điển chứa tất cả các thuộc tính được xác định cho chính đối tượng đó. Việc ánh xạ các thuộc tính với các giá trị của nó được thực hiện để tạo ra một từ điển.. All objects in Python have an attribute __dict__, which is a dictionary object containing all attributes defined for that object itself. The mapping of attributes with its values is done to generate a dictionary.
__ post_init __ python là gì?Phương thức __post_init__ được gọi chỉ 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.just after initialization. In other words, it is called after the object receives values for its fields, such as name , continent , population , and official_lang .
DataClass Python là gì?Các lớp dữ liệu là một trong những tính năng mới của Python 3.7.Với các lớp dữ liệu, bạn không phải viết mã Boilerplate để có được sự khởi tạo, biểu diễn và so sánh thích hợp cho các đối tượng của bạn.Bạn đã thấy cách xác định các lớp dữ liệu của riêng bạn, cũng như: Cách thêm các giá trị mặc định vào các trường trong lớp dữ liệu của bạn.one of the new features of Python 3.7. With data classes, you do not have to write boilerplate code to get proper initialization, representation, and comparisons for your objects. You have seen how to define your own data classes, as well as: How to add default values to the fields in your data class.
Các lớp dữ liệu có thể có phương thức python không?Một DataClass rất có thể có các phương thức trường hợp và lớp thường xuyên.DataClasses được giới thiệu từ Python phiên bản 3.7.Đối với các phiên bản Python dưới 3.7, nó phải được cài đặt dưới dạng thư viện.. Dataclasses were introduced from Python version 3.7. For Python versions below 3.7, it has to be installed as a library. |