Hướng dẫn python dataclass sort key - khóa sắp xếp lớp dữ liệu python

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Sử dụng các lớp dữ liệu trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using Data Classes in Python

Show

Một tính năng mới và thú vị đến trong Python 3.7 là lớp dữ liệu. Một lớp dữ liệu là một lớp thường chứa chủ yếu là dữ liệu, mặc dù không có bất kỳ hạn chế nào. Nó được tạo ra bằng cách sử dụng bộ trang trí

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
8 mới, như sau:

from dataclasses import dataclass

@dataclass
class DataClassCard:
    rank: str
    suit: str

Một lớp dữ liệu đi kèm với chức năng cơ bản đã được thực hiện. Chẳng hạn, bạn có thể khởi tạo, in và so sánh các phiên bản lớp dữ liệu ra khỏi hộp:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

Mặc dù đây không phải là nhiều mã để viết, nhưng bạn đã có thể thấy các dấu hiệu của nỗi đau nồi hơi:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
9 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
0 đều được lặp lại ba lần chỉ đơn giản là khởi tạo một đối tượng. Hơn nữa, nếu bạn cố gắng sử dụng lớp đơn giản này, bạn sẽ nhận thấy rằng đại diện của các đối tượng không được mô tả lắm, và vì một số lý do, một nữ hoàng của trái tim không giống như một nữ hoàng của trái tim:

>>>

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

Mặc dù đây không phải là nhiều mã để viết, nhưng bạn đã có thể thấy các dấu hiệu của nỗi đau nồi hơi:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
9 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
0 đều được lặp lại ba lần chỉ đơn giản là khởi tạo một đối tượng. Hơn nữa, nếu bạn cố gắng sử dụng lớp đơn giản này, bạn sẽ nhận thấy rằng đại diện của các đối tượng không được mô tả lắm, và vì một số lý do, một nữ hoàng của trái tim không giống như một nữ hoàng của trái tim:

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False

  • Có vẻ như các lớp dữ liệu đang giúp chúng tôi ra khỏi hậu trường. Theo mặc định, các lớp dữ liệu thực hiện phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    1 để cung cấp một biểu diễn chuỗi đẹp và phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    2 có thể thực hiện so sánh đối tượng cơ bản. Đối với lớp
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    3 để bắt chước lớp dữ liệu ở trên, bạn cũng cần thêm các phương thức này:
  • Trong hướng dẫn này, bạn sẽ tìm hiểu chính xác những lớp dữ liệu tiện lợi nào cung cấp. Ngoài các đại diện và so sánh tốt đẹp, bạn sẽ thấy:
  • Cách thêm các giá trị mặc định vào các trường lớp dữ liệu
  • Cách các lớp dữ liệu cho phép đặt hàng các đối tượng

Cách biểu diễn dữ liệu bất biến

Cách các lớp dữ liệu xử lý sự kế thừa

Chúng tôi sẽ sớm đi sâu hơn vào các tính năng của các lớp dữ liệu. Tuy nhiên, bạn có thể nghĩ rằng bạn đã thấy một cái gì đó như thế này trước đây.

>>>

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

Mặc dù đây không phải là nhiều mã để viết, nhưng bạn đã có thể thấy các dấu hiệu của nỗi đau nồi hơi:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
9 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
0 đều được lặp lại ba lần chỉ đơn giản là khởi tạo một đối tượng. Hơn nữa, nếu bạn cố gắng sử dụng lớp đơn giản này, bạn sẽ nhận thấy rằng đại diện của các đối tượng không được mô tả lắm, và vì một số lý do, một nữ hoàng của trái tim không giống như một nữ hoàng của trái tim:

  • >>> queen_of_hearts = RegularCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    <__main__.RegularCard object at 0x7fb6eee35d30>
    >>> queen_of_hearts == RegularCard('Q', 'Hearts')
    False
    
  • Có vẻ như các lớp dữ liệu đang giúp chúng tôi ra khỏi hậu trường. Theo mặc định, các lớp dữ liệu thực hiện phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    1 để cung cấp một biểu diễn chuỗi đẹp và phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    2 có thể thực hiện so sánh đối tượng cơ bản. Đối với lớp
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    3 để bắt chước lớp dữ liệu ở trên, bạn cũng cần thêm các phương thức này:
  • Trong hướng dẫn này, bạn sẽ tìm hiểu chính xác những lớp dữ liệu tiện lợi nào cung cấp. Ngoài các đại diện và so sánh tốt đẹp, bạn sẽ thấy:

Cách thêm các giá trị mặc định vào các trường lớp dữ liệu

>>>

>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

from collections import namedtuple

NamedTupleCard = namedtuple('NamedTupleCard', ['rank', 'suit'])

Mặc dù đây không phải là nhiều mã để viết, nhưng bạn đã có thể thấy các dấu hiệu của nỗi đau nồi hơi:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
9 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
0 đều được lặp lại ba lần chỉ đơn giản là khởi tạo một đối tượng. Hơn nữa, nếu bạn cố gắng sử dụng lớp đơn giản này, bạn sẽ nhận thấy rằng đại diện của các đối tượng không được mô tả lắm, và vì một số lý do, một nữ hoàng của trái tim không giống như một nữ hoàng của trái tim:

>>>

>>> queen_of_hearts = NamedTupleCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
NamedTupleCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == NamedTupleCard('Q', 'Hearts')
True

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

>>>

>>> queen_of_hearts == ('Q', 'Hearts')
True

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
0

So sánh điều đó với một lớp học thông thường. Một lớp học thường xuyên tối thiểu sẽ trông giống như thế này:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
1

Mặc dù đây không phải là nhiều mã để viết, nhưng bạn đã có thể thấy các dấu hiệu của nỗi đau nồi hơi:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
9 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
0 đều được lặp lại ba lần chỉ đơn giản là khởi tạo một đối tượng. Hơn nữa, nếu bạn cố gắng sử dụng lớp đơn giản này, bạn sẽ nhận thấy rằng đại diện của các đối tượng không được mô tả lắm, và vì một số lý do, một nữ hoàng của trái tim không giống như một nữ hoàng của trái tim:

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
2

Có vẻ như các lớp dữ liệu đang giúp chúng tôi ra khỏi hậu trường. Theo mặc định, các lớp dữ liệu thực hiện phương thức

>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 để cung cấp một biểu diễn chuỗi đẹp và phương thức
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
2 có thể thực hiện so sánh đối tượng cơ bản. Đối với lớp
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
3 để bắt chước lớp dữ liệu ở trên, bạn cũng cần thêm các phương thức này:

Ngoài

>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
4,
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
5,
from collections import namedtuple

NamedTupleCard = namedtuple('NamedTupleCard', ['rank', 'suit'])
1 và
>>> queen_of_hearts = NamedTupleCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
NamedTupleCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == NamedTupleCard('Q', 'Hearts')
True
3, có nhiều dự án tương tự khác, bao gồm
>>> queen_of_hearts == ('Q', 'Hearts')
True
5,
>>> queen_of_hearts == ('Q', 'Hearts')
True
6,
>>> queen_of_hearts == ('Q', 'Hearts')
True
7,
>>> queen_of_hearts == ('Q', 'Hearts')
True
8 và
>>> queen_of_hearts == ('Q', 'Hearts')
True
9. Mặc dù các lớp dữ liệu là một giải pháp thay thế mới tuyệt vời, nhưng vẫn có những trường hợp sử dụng một trong những biến thể cũ hơn phù hợp hơn. Chẳng hạn, nếu bạn cần khả năng tương thích với một API cụ thể mong đợi các bộ dữ liệu hoặc chức năng cần không được hỗ trợ trong các lớp dữ liệu.

Các lớp dữ liệu cơ bản

Hãy để chúng tôi quay lại các lớp dữ liệu. Ví dụ, chúng tôi sẽ tạo một lớp

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00 sẽ đại diện cho các vị trí địa lý với tên cũng như vĩ độ và kinh độ:

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
3

Điều làm cho đây là một lớp dữ liệu là trình trang trí

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
8 ngay trên định nghĩa lớp. Bên dưới dòng
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
02, bạn chỉ cần liệt kê các trường bạn muốn trong lớp dữ liệu của mình. Ký hiệu
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
03 được sử dụng cho các trường đang sử dụng một tính năng mới trong Python 3.6 được gọi là chú thích biến. Chúng tôi sẽ sớm nói thêm về ký hiệu này và lý do tại sao chúng tôi chỉ định các loại dữ liệu như
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
04 và
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
05.

Một vài dòng mã là tất cả những gì bạn cần. Lớp mới đã sẵn sàng để sử dụng:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
4

Bạn cũng có thể tạo các lớp dữ liệu tương tự như cách tạo các bộ dữ liệu được đặt tên. Sau đây là (gần như) tương đương với định nghĩa của

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00 ở trên:

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
5

Một lớp dữ liệu là một lớp Python thông thường. Điều duy nhất làm cho nó khác biệt là nó có các phương thức mô hình dữ liệu cơ bản như

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07,
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
2 được triển khai cho bạn.

Giá trị mặc định

Thật dễ dàng để thêm các giá trị mặc định vào các trường của lớp dữ liệu của bạn:

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
6

Điều này hoạt động chính xác như thể bạn đã chỉ định các giá trị mặc định trong định nghĩa của phương thức

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 của một lớp thông thường:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
7

Bạn cũng có thể tạo các lớp dữ liệu tương tự như cách tạo các bộ dữ liệu được đặt tên. Sau đây là (gần như) tương đương với định nghĩa của

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00 ở trên:

Một lớp dữ liệu là một lớp Python thông thường. Điều duy nhất làm cho nó khác biệt là nó có các phương thức mô hình dữ liệu cơ bản như >>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 07, >>> queen_of_hearts_tuple[0] # No named access 'Q' >>> queen_of_hearts_dict['suit'] # Would be nicer with .suit 'Hearts' 1 và >>> queen_of_hearts_tuple[0] # No named access 'Q' >>> queen_of_hearts_dict['suit'] # Would be nicer with .suit 'Hearts' 2 được triển khai cho bạn.

Giá trị mặc định

Thật dễ dàng để thêm các giá trị mặc định vào các trường của lớp dữ liệu của bạn:

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
8

Điều này hoạt động chính xác như thể bạn đã chỉ định các giá trị mặc định trong định nghĩa của phương thức

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 của một lớp thông thường:

>>>

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
9

Bạn cũng có thể tạo các lớp dữ liệu tương tự như cách tạo các bộ dữ liệu được đặt tên. Sau đây là (gần như) tương đương với định nghĩa của

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00 ở trên:

Một lớp dữ liệu là một lớp Python thông thường. Điều duy nhất làm cho nó khác biệt là nó có các phương thức mô hình dữ liệu cơ bản như >>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 07, >>> queen_of_hearts_tuple[0] # No named access 'Q' >>> queen_of_hearts_dict['suit'] # Would be nicer with .suit 'Hearts' 1 và >>> queen_of_hearts_tuple[0] # No named access 'Q' >>> queen_of_hearts_dict['suit'] # Would be nicer with .suit 'Hearts' 2 được triển khai cho bạn.

Giá trị mặc định

Hướng dẫn python dataclass sort key - khóa sắp xếp lớp dữ liệu python

Thật dễ dàng để thêm các giá trị mặc định vào các trường của lớp dữ liệu của bạn:

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
0

Điều này hoạt động chính xác như thể bạn đã chỉ định các giá trị mặc định trong định nghĩa của phương thức

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 của một lớp thông thường:

>>>

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
1

Bạn cũng có thể tạo các lớp dữ liệu tương tự như cách tạo các bộ dữ liệu được đặt tên. Sau đây là (gần như) tương đương với định nghĩa của >>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 00 ở trên:

Một lớp dữ liệu là một lớp Python thông thường. Điều duy nhất làm cho nó khác biệt là nó có các phương thức mô hình dữ liệu cơ bản như

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07,
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
2 được triển khai cho bạn.

Giá trị mặc định

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
2

Thật dễ dàng để thêm các giá trị mặc định vào các trường của lớp dữ liệu của bạn:

>>>

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
3

Bạn cũng có thể tạo các lớp dữ liệu tương tự như cách tạo các bộ dữ liệu được đặt tên. Sau đây là (gần như) tương đương với định nghĩa của >>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 00 ở trên:

Một lớp dữ liệu là một lớp Python thông thường. Điều duy nhất làm cho nó khác biệt là nó có các phương thức mô hình dữ liệu cơ bản như

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07,
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 và
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
2 được triển khai cho bạn.

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
4

Giá trị mặc định

Thật dễ dàng để thêm các giá trị mặc định vào các trường của lớp dữ liệu của bạn: Above, we used Unicode glyphs like

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
23 directly in the source code. We could do this because Python supports writing source code in UTF-8 by default. Refer to this page on Unicode input for how to enter these on your system. You could also enter the Unicode symbols for the suits using
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
24 named character escapes (like
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
25) or
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
26 Unicode escapes (like
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
27).

Để đơn giản hóa so sánh các thẻ sau này, các cấp bậc và bộ quần áo cũng được liệt kê theo thứ tự thông thường của chúng.

>>>

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
5

Về lý thuyết, bây giờ bạn có thể sử dụng chức năng này để chỉ định giá trị mặc định cho

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
28:

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
6

Don lồng làm điều này! Điều này giới thiệu một trong những loại chống lại phổ biến nhất trong Python: sử dụng các đối số mặc định có thể thay đổi. Vấn đề là tất cả các trường hợp của

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19 sẽ sử dụng cùng một đối tượng danh sách làm giá trị mặc định của thuộc tính
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
30. Điều này có nghĩa là nếu, giả sử, một thẻ được xóa khỏi một
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19, thì nó cũng biến mất khỏi tất cả các trường hợp khác của
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19. Trên thực tế, các lớp dữ liệu cố gắng ngăn bạn thực hiện việc này và mã trên sẽ tăng
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
33.

Thay vào đó, các lớp dữ liệu sử dụng một thứ gọi là

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
11 để xử lý các giá trị mặc định có thể thay đổi. Để sử dụng
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
11 (và nhiều tính năng thú vị khác của các lớp dữ liệu), bạn cần sử dụng trình xác định
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
18:

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
7

Đối số cho

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
11 có thể là bất kỳ tham số nào có thể gọi được. Bây giờ thật dễ dàng để tạo ra một bộ bài chơi đầy đủ:

>>>

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
8

Về lý thuyết, bây giờ bạn có thể sử dụng chức năng này để chỉ định giá trị mặc định cho

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
28:

  • Don lồng làm điều này! Điều này giới thiệu một trong những loại chống lại phổ biến nhất trong Python: sử dụng các đối số mặc định có thể thay đổi. Vấn đề là tất cả các trường hợp của
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    19 sẽ sử dụng cùng một đối tượng danh sách làm giá trị mặc định của thuộc tính
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    30. Điều này có nghĩa là nếu, giả sử, một thẻ được xóa khỏi một
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    19, thì nó cũng biến mất khỏi tất cả các trường hợp khác của
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    19. Trên thực tế, các lớp dữ liệu cố gắng ngăn bạn thực hiện việc này và mã trên sẽ tăng
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    33.
  • Thay vào đó, các lớp dữ liệu sử dụng một thứ gọi là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    11 để xử lý các giá trị mặc định có thể thay đổi. Để sử dụng
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    11 (và nhiều tính năng thú vị khác của các lớp dữ liệu), bạn cần sử dụng trình xác định
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    18:
  • Đối số cho
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    11 có thể là bất kỳ tham số nào có thể gọi được. Bây giờ thật dễ dàng để tạo ra một bộ bài chơi đầy đủ:
  • Bộ xác định
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    18 được sử dụng để tùy chỉnh từng trường của một lớp dữ liệu riêng lẻ. Bạn sẽ thấy một số ví dụ khác sau. Để tham khảo, đây là các tham số
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    18 hỗ trợ:
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    40: Giá trị mặc định của trường
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    11: Hàm trả về giá trị ban đầu của trường
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    42: Sử dụng trường trong phương pháp
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    07? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    44.)

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
45: Sử dụng trường trong
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
45 của đối tượng? (Mặc định là
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
44.)

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
48: Bao gồm các trường trong so sánh? (Mặc định là
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
44.)

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
9

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
50: Bao gồm trường khi tính toán
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
51? (Mặc định là sử dụng giống như đối với
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
48.)

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
0

>>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 53: Bản đồ với thông tin về trường

Trong ví dụ

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00, bạn đã thấy cách thêm các giá trị mặc định đơn giản bằng cách viết
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
55. Tuy nhiên, nếu bạn cũng muốn tùy chỉnh trường, ví dụ, để ẩn nó trong
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
45, bạn cần sử dụng tham số
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
40:
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
58. Bạn không được chỉ định cả
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
40 và
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
11.

>>>

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
8

Tham số

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
53 không được sử dụng bởi chính các lớp dữ liệu nhưng có sẵn cho bạn (hoặc gói bên thứ ba) để đính kèm thông tin vào các trường. Trong ví dụ
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
00, ví dụ bạn có thể xác định rằng vĩ độ và kinh độ nên được đưa ra theo độ:

  • Siêu dữ liệu (và thông tin khác về trường) có thể được truy xuất bằng hàm

    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    63 (lưu ý số nhiều):

  • Bạn cần đại diện?

Hãy nhớ lại rằng chúng ta có thể tạo các sàn thẻ ra khỏi không khí mỏng:

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
2

Mặc dù đại diện này của

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19 là rõ ràng và có thể đọc được, nhưng nó cũng rất dài dòng. Tôi đã xóa 48 trong số 52 thẻ trong bộ bài ở đầu ra ở trên. Trên màn hình 80 cột, chỉ cần in toàn bộ
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19 chiếm 22 dòng! Hãy để chúng tôi thêm một đại diện ngắn gọn hơn. Nói chung, một đối tượng Python có hai biểu diễn chuỗi khác nhau:

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
3

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
66 được xác định bởi
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
67 và sẽ trả về một đại diện thân thiện với nhà phát triển là
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
68. Nếu có thể, đây phải là mã có thể tạo lại
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
68. Các lớp dữ liệu làm điều này.

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
4

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
70 được xác định bởi
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
71 và sẽ trả về một đại diện thân thiện với người dùng là
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
68. Các lớp dữ liệu không thực hiện phương thức
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
73, vì vậy Python sẽ quay trở lại phương thức
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1.

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
5

Hãy để chúng tôi thực hiện biểu diễn thân thiện với người dùng của >>> queen_of_hearts = DataClassCard('Q', 'Hearts') >>> queen_of_hearts.rank 'Q' >>> queen_of_hearts DataClassCard(rank='Q', suit='Hearts') >>> queen_of_hearts == DataClassCard('Q', 'Hearts') True 22:

Các thẻ bây giờ trông đẹp hơn nhiều, nhưng bộ bài vẫn còn dài hơn bao giờ hết:

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
6

Để chỉ ra rằng cũng có thể thêm phương thức

>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 của riêng bạn, chúng tôi sẽ vi phạm nguyên tắc rằng nó sẽ trả về mã có thể tạo lại một đối tượng. Thực tế đánh bại sự thuần khiết sau tất cả. Mã sau đây thêm một biểu diễn ngắn gọn hơn của
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19:

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
7

Lưu ý Trình xác định

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
78 trong chuỗi định dạng
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
79. Điều đó có nghĩa là chúng tôi rõ ràng muốn sử dụng biểu diễn
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
80 của mỗi
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
22. Với
>>> queen_of_hearts_tuple[0]  # No named access
'Q'
>>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
'Hearts'
1 mới, đại diện của
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
19 dễ dàng hơn trên mắt:

  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    42: Thêm phương thức
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    07? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    44.)
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    45: Thêm phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    1? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    44.)
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    94: Thêm phương thức
    >>> queen_of_hearts_tuple[0]  # No named access
    'Q'
    >>> queen_of_hearts_dict['suit']  # Would be nicer with .suit
    'Hearts'
    
    2? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    44.)
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    97: Thêm phương thức đặt hàng? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    98.)
  • >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    99: Buộc bổ sung phương pháp
    class RegularCard:
        def __init__(self, rank, suit):
            self.rank = rank
            self.suit = suit
    
    00? (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    98.)
  • class RegularCard:
        def __init__(self, rank, suit):
            self.rank = rank
            self.suit = suit
    
    02: Nếu
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    44, việc gán cho các trường sẽ tăng một ngoại lệ. (Mặc định là
    >>> queen_of_hearts = DataClassCard('Q', 'Hearts')
    >>> queen_of_hearts.rank
    'Q'
    >>> queen_of_hearts
    DataClassCard(rank='Q', suit='Hearts')
    >>> queen_of_hearts == DataClassCard('Q', 'Hearts')
    True
    
    98.)

Xem PEP ban đầu để biết thêm thông tin về từng tham số. Sau khi cài đặt

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
05, các phiên bản của
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
22 có thể được so sánh:

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
8

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
07 xuất hiện sau
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
08 trong bảng chữ cái:

>>>

>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
9

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
0

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
1

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
07 xuất hiện sau
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
08 trong bảng chữ cái:

Điều đó không thực sự làm việc cho chúng tôi. Thay vào đó, chúng ta cần xác định một số loại chỉ mục sắp xếp sử dụng thứ tự

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
09 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
10. Một cái gì đó như thế này:

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
2

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
3

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
4

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì class RegularCard: def __init__(self, rank, suit): self.rank = rank self.suit = suit 07 xuất hiện sau class RegularCard: def __init__(self, rank, suit): self.rank = rank self.suit = suit 08 trong bảng chữ cái:

Điều đó không thực sự làm việc cho chúng tôi. Thay vào đó, chúng ta cần xác định một số loại chỉ mục sắp xếp sử dụng thứ tự

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
09 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
10. Một cái gì đó như thế này:

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
5

Đối với

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
22 để sử dụng chỉ mục sắp xếp này để so sánh, chúng ta cần thêm một trường
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
12 vào lớp. Tuy nhiên, trường này phải được tính toán từ các trường khác
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
13 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
14. Đây chính xác là những gì phương pháp đặc biệt
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
15 dành cho. Nó cho phép xử lý đặc biệt sau khi phương pháp
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 thông thường được gọi là:

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
6

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
7

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
07 xuất hiện sau
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
08 trong bảng chữ cái:

>>>

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
8

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì class RegularCard: def __init__(self, rank, suit): self.rank = rank self.suit = suit 07 xuất hiện sau class RegularCard: def __init__(self, rank, suit): self.rank = rank self.suit = suit 08 trong bảng chữ cái:

Điều đó không thực sự làm việc cho chúng tôi. Thay vào đó, chúng ta cần xác định một số loại chỉ mục sắp xếp sử dụng thứ tự

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
09 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
10. Một cái gì đó như thế này:

class RegularCard
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __repr__(self):
        return (f'{self.__class__.__name__}'
                f'(rank={self.rank!r}, suit={self.suit!r})')

    def __eq__(self, other):
        if other.__class__ is not self.__class__:
            return NotImplemented
        return (self.rank, self.suit) == (other.rank, other.suit)
9

Đối với

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
22 để sử dụng chỉ mục sắp xếp này để so sánh, chúng ta cần thêm một trường
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
12 vào lớp. Tuy nhiên, trường này phải được tính toán từ các trường khác
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
13 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
14. Đây chính xác là những gì phương pháp đặc biệt
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
15 dành cho. Nó cho phép xử lý đặc biệt sau khi phương pháp
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 thông thường được gọi là:

>>>

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
0

Làm thế nào là hai thẻ được so sánh mặc dù? Bạn chưa chỉ định cách thức đặt hàng như thế nào và vì một số lý do, Python dường như tin rằng một nữ hoàng cao hơn một ace

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
1

Nó chỉ ra rằng các lớp dữ liệu so sánh các đối tượng như thể chúng là bộ dữ liệu của trường của chúng. Nói cách khác, một nữ hoàng cao hơn một át chủ bài vì

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
07 xuất hiện sau
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
08 trong bảng chữ cái:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
2

Điều đó không thực sự làm việc cho chúng tôi. Thay vào đó, chúng ta cần xác định một số loại chỉ mục sắp xếp sử dụng thứ tự

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
09 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
10. Một cái gì đó như thế này:

Đối với

>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
22 để sử dụng chỉ mục sắp xếp này để so sánh, chúng ta cần thêm một trường
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
12 vào lớp. Tuy nhiên, trường này phải được tính toán từ các trường khác
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
13 và
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
14. Đây chính xác là những gì phương pháp đặc biệt
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
15 dành cho. Nó cho phép xử lý đặc biệt sau khi phương pháp
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
07 thông thường được gọi là:

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
3

Sau đó, thứ tự của các trường trong

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
37 vẫn sẽ là
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts.rank
'Q'
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
13,
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
41,
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
42,
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
35. Tuy nhiên, giá trị mặc định của
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
42 sẽ là
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
52.

>>>

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
4

Tối ưu hóa các lớp dữ liệu

Tôi sẽ kết thúc hướng dẫn này với một vài từ về các vị trí. Các khe có thể được sử dụng để làm cho các lớp nhanh hơn và sử dụng ít bộ nhớ hơn. Các lớp dữ liệu không có cú pháp rõ ràng để làm việc với các vị trí, nhưng cách tạo các vị trí bình thường cũng hoạt động cho các lớp dữ liệu. (Họ thực sự chỉ là các lớp học thường xuyên!)

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
5

Về cơ bản, các khe được xác định bằng cách sử dụng

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
53 để liệt kê các biến trên một lớp. Các biến hoặc thuộc tính không có trong
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
53 có thể không được xác định. Hơn nữa, một lớp khe có thể không có giá trị mặc định.

Lợi ích của việc thêm các hạn chế như vậy là một số tối ưu hóa nhất định có thể được thực hiện. Chẳng hạn, các lớp các vị trí chiếm ít bộ nhớ hơn, như có thể được đo bằng pympler:

>>>

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
6

Tối ưu hóa các lớp dữ liệu

>>>

>>> queen_of_hearts_tuple = ('Q', 'Hearts')
>>> queen_of_hearts_dict = {'rank': 'Q', 'suit': 'Hearts'}
7

Tối ưu hóa các lớp dữ liệu

Tôi sẽ kết thúc hướng dẫn này với một vài từ về các vị trí. Các khe có thể được sử dụng để làm cho các lớp nhanh hơn và sử dụng ít bộ nhớ hơn. Các lớp dữ liệu không có cú pháp rõ ràng để làm việc với các vị trí, nhưng cách tạo các vị trí bình thường cũng hoạt động cho các lớp dữ liệu. (Họ thực sự chỉ là các lớp học thường xuyên!)

Về cơ bản, các khe được xác định bằng cách sử dụng

class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
53 để liệt kê các biến trên một lớp. Các biến hoặc thuộc tính không có trong
class RegularCard:
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
53 có thể không được xác định. Hơn nữa, một lớp khe có thể không có giá trị mặc định.

Lợi ích của việc thêm các hạn chế như vậy là một số tối ưu hóa nhất định có thể được thực hiện. Chẳng hạn, các lớp các vị trí chiếm ít bộ nhớ hơn, như có thể được đo bằng pympler:

  • Tương tự, các lớp khe thường nhanh hơn để làm việc. Ví dụ sau đây đo tốc độ của quyền truy cập thuộc tính trên lớp dữ liệu SLOTS và lớp dữ liệu thông thường bằng thời gian sử dụng thời gian từ thư viện tiêu chuẩn.
  • Trong ví dụ cụ thể này, lớp khe cắm nhanh hơn khoảng 35%.
  • Kết luận & đọc thêm
  • 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

Cách tùy chỉnh thứ tự của các đối tượng lớp dữ liệu

Cách làm việc với các lớp dữ liệu bất biến This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using Data Classes in Python