Trong Python, lớp dữ liệu là lớp được thiết kế để chỉ chứa các giá trị dữ liệu. Chúng không khác với các lớp thông thường, nhưng chúng thường không có bất kỳ phương thức nào khác. Chúng thường được sử dụng để lưu trữ thông tin sẽ được chuyển giữa các phần khác nhau của chương trình hoặc hệ thống
Tuy nhiên, khi tạo các lớp chỉ hoạt động như các thùng chứa dữ liệu, việc viết phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5 lặp đi lặp lại có thể tạo ra một lượng lớn công việc và các lỗi tiềm ẩnMô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6, một tính năng được giới thiệu trong Python 3. 7, cung cấp cách tạo các lớp dữ liệu một cách đơn giản hơn mà không cần viết các phương thức. Trong bài viết này, chúng ta sẽ xem cách tận dụng mô-đun này để nhanh chóng tạo các lớp mới không chỉ có sẵn với
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5 mà còn một số phương thức khác đã được triển khai nên chúng ta không cần phải triển khai chúng theo cách thủ công. Ngoài ra, chúng ta có thể làm điều đó chỉ với một vài dòng mãChúng tôi mong bạn có một số kinh nghiệm trung cấp về python, bao gồm hiểu biết về cách tạo lớp và lập trình hướng đối tượng nói chung
Sử dụng Mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
Ví dụ bắt đầu, giả sử chúng ta đang triển khai một lớp để lưu trữ dữ liệu về một nhóm người nhất định. Đối với mỗi người, chúng tôi sẽ có các thuộc tính như tên, tuổi, chiều cao và địa chỉ email. Đây là những gì một lớp học bình thường trông giống như
class Person[]:
def __init__[self, name, age, height, email]:
self.name = name
self.age = age
self.height = height
self.email = email
Tuy nhiên, nếu chúng tôi sử dụng mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6, chúng tôi cần nhập person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0 để sử dụng nó làm công cụ trang trí trong lớp mà chúng tôi đang tạo. Khi chúng ta làm điều đó, chúng ta không cần phải viết hàm init nữa, chỉ cần xác định các thuộc tính của lớp và các loại của chúng. Đây là cùng một lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1, được triển khai theo cách này________số 8Chúng ta cũng có thể đặt các giá trị mặc định cho các thuộc tính của lớp
@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
0Xin nhắc lại, Python không chấp nhận thuộc tính không mặc định sau mặc định trong cả lớp và hàm, vì vậy điều này sẽ gây ra lỗi
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
1
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
Sau khi lớp được xác định, thật dễ dàng để khởi tạo một đối tượng mới và truy cập các thuộc tính của nó, giống như với một lớp tiêu chuẩn
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
4Cho đến nay, chúng tôi đã sử dụng các kiểu dữ liệu thông thường như chuỗi, số nguyên và dấu phẩy động; . Chẳng hạn, hãy thêm thuộc tính
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
4 vào person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
9
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
0Theo logic tương tự, chúng ta có thể tạo một lớp dữ liệu để chứa nhiều phiên bản của lớp
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
0Lưu ý rằng thuộc tính
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
7 trong lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 được định nghĩa là danh sách các thể hiện của lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1. Ví dụ: chúng ta có thể khởi tạo một đối tượng của person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 như thế nàyfrom dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
1from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
2Điều này cho phép chúng tôi xác định thuộc tính là bất kỳ loại nào chúng tôi muốn, nhưng cũng là sự kết hợp của các loại dữ liệu
Biểu diễn và So sánh
Như chúng tôi đã đề cập trước đó,
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0 không chỉ triển khai phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5 mà còn thực hiện một số phương thức khác, bao gồm cả phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
43. Trong một lớp thông thường, chúng tôi sử dụng phương thức này để hiển thị một đại diện của một đối tượng trong lớpChẳng hạn, chúng ta sẽ định nghĩa phương thức như trong ví dụ bên dưới khi chúng ta gọi đối tượng
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
3from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
4Tuy nhiên, khi sử dụng
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0, không cần phải viết bất kỳ thứ gì trong số đófrom dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
5from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
6Lưu ý rằng không có tất cả mã đó, đầu ra tương đương với mã từ lớp Python tiêu chuẩn
Chúng tôi luôn có thể ghi đè lên nó nếu chúng tôi muốn tùy chỉnh cách biểu diễn của lớp mình
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
7from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
8Lưu ý rằng đầu ra của biểu diễn được tùy chỉnh
Khi so sánh, mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6 giúp cuộc sống của chúng ta dễ dàng hơn. Ví dụ: chúng ta có thể so sánh trực tiếp hai thể hiện của một lớp như thế nàyfrom dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
9@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
0Lưu ý rằng chúng tôi đã sử dụng các thuộc tính mặc định để làm cho ví dụ ngắn hơn
Trong trường hợp này, phép so sánh hợp lệ vì
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0 tạo ra một phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
47 đằng sau hậu trường, phương thức này thực hiện phép so sánh. Nếu không có decorator, chúng ta phải tự tạo phương thức nàySo sánh tương tự sẽ dẫn đến một kết quả khác nếu sử dụng một lớp Python tiêu chuẩn, mặc dù các lớp trên thực tế là bằng nhau
@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
1@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
2Nếu không sử dụng trình trang trí
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0, lớp đó sẽ không kiểm tra xem hai phiên bản có bằng nhau không. Vì vậy, theo mặc định, Python sẽ sử dụng đối tượng
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
49 để so sánh và như chúng ta thấy bên dưới, chúng khác nhau@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
3@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
4Tất cả điều này có nghĩa là chúng ta phải viết một phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
47 để thực hiện phép so sánh này@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
5@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
0Bây giờ chúng ta thấy hai đối tượng bằng nhau, nhưng chúng ta phải viết thêm mã để có được kết quả này
Tham số
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
91
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
Như chúng ta đã thấy ở trên, khi sử dụng trình trang trí
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0, các phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5,
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
43 và
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
47 được triển khai cho chúng tôi. Việc tạo ra tất cả các phương thức này được thiết lập bởi các tham số
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
96,
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
97 và
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
98 của person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0. Ba tham số này là
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
00 theo mặc định. Nếu một trong số chúng được tạo bên trong lớp, thì tham số sẽ bị bỏ quaTuy nhiên, chúng tôi có các tham số khác của
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0 mà chúng tôi nên xem xét trước khi tiếp tục
02. cho phép sắp xếp lớp như chúng ta sẽ thấy trong phần tiếp theo. Mặc định là--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
03--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
04. Khi--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
00, các giá trị bên trong thể hiện của lớp không thể được sửa đổi sau khi nó được tạo. Mặc định là--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
03--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
Có một vài phương pháp khác mà bạn có thể kiểm tra trong tài liệu
Sắp xếp
Khi làm việc với dữ liệu, chúng ta thường cần sắp xếp các giá trị. Trong kịch bản của chúng tôi, chúng tôi có thể muốn sắp xếp những người khác nhau dựa trên một số thuộc tính. Đối với điều đó, chúng tôi sẽ sử dụng tham số
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
02 của trình trang trí person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
0 được đề cập ở trên, cho phép sắp xếp trong lớp@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
7Khi tham số
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
02 được đặt thành
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
00, nó sẽ tự động tạo các phương thức from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
01 [nhỏ hơn], from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
02 [nhỏ hơn hoặc bằng], from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
03 [lớn hơn] và from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
04 [lớn hơn hoặc bằng] được sử dụng để sắp xếpHãy khởi tạo các đối tượng
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
05 và from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
06 của chúng ta để xem liệu cái này có lớn hơn cái kia không@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
8@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
2Python cho chúng ta biết rằng
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
05 không lớn hơn from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
06, nhưng dựa trên tiêu chí nào?
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
00@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
2Vì chữ "J" đứng trước chữ "M", nó nói là
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
09. Nếu các tên giống nhau, nó sẽ chuyển sang phần tử tiếp theo trong mỗi bộ. Như vậy, nó đang so sánh các đối tượng theo thứ tự bảng chữ cái. Mặc dù điều đó có thể có ý nghĩa tùy thuộc vào vấn đề mà chúng ta đang xử lý, nhưng chúng ta muốn có thể kiểm soát cách các đối tượng sẽ được sắp xếpĐể đạt được điều đó, chúng ta sẽ tận dụng hai tính năng khác của mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6Đầu tiên là hàm
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
11. Hàm này được sử dụng để tùy chỉnh một thuộc tính của một lớp dữ liệu riêng lẻ, cho phép chúng ta xác định các thuộc tính mới sẽ phụ thuộc vào một thuộc tính khác và sẽ chỉ được tạo sau khi đối tượng được khởi tạoTrong vấn đề sắp xếp của chúng tôi, chúng tôi sẽ sử dụng
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
11 để tạo thuộc tính from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
13 trong lớp của chúng tôi. Thuộc tính này chỉ có thể được tạo sau khi đối tượng được khởi tạo và là thứ mà
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6 sử dụng để sắp xếp
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
02Hai đối số mà chúng tôi đã thông qua là
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
03 nói rằng thuộc tính này không có trong
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5 và nó sẽ không được hiển thị khi chúng tôi gọi
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
43. Có các tham số khác trong hàm from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
11 mà bạn có thể kiểm tra trong tài liệuSau khi chúng tôi đã tham chiếu thuộc tính mới này, chúng tôi sẽ sử dụng công cụ mới thứ hai. phương pháp
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
19. Đúng như tên gọi, phương thức này được thực thi ngay sau phương thức
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
5. Chúng tôi sẽ sử dụng from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
19 để xác định from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
13, ngay sau khi tạo đối tượng. Ví dụ: giả sử chúng tôi muốn so sánh mọi người dựa trên tuổi của họ. Đây là cách
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
03Nếu chúng ta so sánh tương tự, chúng ta biết rằng Joe trẻ hơn Mary
@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
8@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
2Nếu chúng tôi muốn sắp xếp mọi người theo chiều cao, chúng tôi sẽ sử dụng mã này
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
06@dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
0Joe cao hơn Mary. Lưu ý rằng chúng tôi đặt
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
13 là một from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
24Chúng tôi có thể triển khai sắp xếp trong lớp dữ liệu của mình mà không cần phải viết nhiều phương thức
Làm việc với các lớp dữ liệu bất biến
Một tham số khác của
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
91 mà chúng tôi đã đề cập ở trên là
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
04. Khi được đặt thành
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
00,
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
04 không cho phép chúng tôi sửa đổi các thuộc tính của một đối tượng sau khi nó được tạoVới
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
29, chúng ta có thể dễ dàng thực hiện việc sửa đổi đó
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
08
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
09Chúng tôi đã tạo một đối tượng
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1 và sau đó sửa đổi thuộc tính from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
31 mà không gặp bất kỳ sự cố nàoTuy nhiên, khi được đặt thành
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
00, mọi nỗ lực sửa đổi đối tượng đều gây ra lỗi
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
10
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
11Lưu ý rằng thông báo lỗi nêu rõ
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
33Có một thủ thuật có thể sửa đổi giá trị của lớp dữ liệu bất biến. Nếu lớp của chúng ta chứa thuộc tính có thể thay đổi, thì thuộc tính này có thể thay đổi ngay cả khi lớp bị đóng băng. Điều này có vẻ như không có ý nghĩa gì, nhưng hãy xem một ví dụ
Hãy nhớ lại lớp
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 mà chúng ta đã tạo trước đó trong bài viết này, nhưng bây giờ hãy làm cho nó trở nên bất biến
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
12Sau đó, chúng tôi tạo hai phiên bản của lớp
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1 và sử dụng chúng để tạo một phiên bản của person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 mà chúng tôi sẽ đặt tên là from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
37
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
13
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
14Thuộc tính
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
7 trong lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 là một danh sách. Chúng ta có thể dễ dàng truy cập các giá trị trong danh sách này trong đối tượng from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
37
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
15from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
6Vì vậy, mặc dù cả hai lớp
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1 và person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
8 đều là bất biến, nhưng danh sách thì không, có nghĩa là chúng ta có thể thay đổi các giá trị trong đó
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
17
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
09Lưu ý rằng tuổi bây giờ là 35
Chúng tôi đã không thay đổi các thuộc tính của bất kỳ đối tượng nào trong các lớp bất biến, nhưng chúng tôi đã thay thế phần tử đầu tiên của danh sách bằng một đối tượng khác và danh sách có thể thay đổi
Hãy nhớ rằng tất cả các thuộc tính của lớp cũng phải là bất biến để làm việc an toàn với các lớp dữ liệu bất biến
Thừa kế với
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
Mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6 cũng hỗ trợ tính kế thừa, nghĩa là chúng ta có thể tạo một lớp dữ liệu sử dụng các thuộc tính của một lớp dữ liệu khác. Vẫn sử dụng lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1 của chúng tôi, chúng tôi sẽ tạo một lớp from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
46 mới kế thừa tất cả các thuộc tính từ person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1. Vậy ta có
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1. @dataclass
class Person[]:
name: str = 'Joe'
age: int = 30
height: float = 1.85
email: str = '[email protected]'
print[Person[]]
7Và lớp
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
46 mới
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
0Bây giờ chúng ta có thể tạo một đối tượng của lớp
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
46 bằng cách sử dụng tất cả các thuộc tính của lớp person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
1
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
2Từ giờ trở đi, chúng ta cũng có thể sử dụng mọi thứ chúng ta đã thấy trong bài viết này trong lớp
from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
46Lưu ý các thuộc tính mặc định. Giả sử chúng ta có các thuộc tính mặc định trong
person = Person['Joe', 25, 1.85, '[email protected]']
print[person.name]
1, nhưng không có trong from dataclasses import dataclass
@dataclass
class Person[]:
name: str
age: int
height: float
email: str
46. Kịch bản này, như trong đoạn mã dưới đây, gây ra lỗi
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
3____04Nếu lớp cơ sở có các thuộc tính mặc định thì tất cả các thuộc tính trong lớp dẫn xuất từ nó cũng phải có các giá trị mặc định
Sự kết luận
Trong bài viết này, chúng ta đã thấy mô-đun
---------------------------------------------------------------------------
TypeError Traceback [most recent call last]
~\AppData\Local\Temp/ipykernel_5540/741473360.py in
1 @dataclass
----> 2 class Person[]:
3 name: str = 'Joe'
4 age: int = 30
5 height: float = 1.85
~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen]
1019
1020 # We're called as @dataclass without parens.
-> 1021 return wrap[cls]
1022
1023
~\anaconda3\lib\dataclasses.py in wrap[cls]
1011
1012 def wrap[cls]:
-> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
1014
1015 # See if we're being called as @dataclass or @dataclass[].
~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen]
925 if f._field_type in [_FIELD, _FIELD_INITVAR]]
926 _set_new_attribute[cls, '__init__',
--> 927 _init_fn[flds,
928 frozen,
929 has_post_init,
~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals]
502 seen_default = True
503 elif seen_default:
--> 504 raise TypeError[f'non-default argument {f.name!r} '
505 'follows default argument']
506
TypeError: non-default argument 'email' follows default argument
6 là một công cụ rất mạnh để tạo các lớp dữ liệu một cách nhanh chóng, trực quan như thế nào. Mặc dù chúng ta đã thấy rất nhiều điều trong bài viết này, nhưng mô-đun này chứa nhiều công cụ hơn và luôn có nhiều điều hơn để tìm hiểu về nóCho đến nay, chúng tôi đã học được cách
Xác định một lớp bằng cách sử dụng
6--------------------------------------------------------------------------- TypeError Traceback [most recent call last] ~\AppData\Local\Temp/ipykernel_5540/741473360.py in 1 @dataclass ----> 2 class Person[]: 3 name: str = 'Joe' 4 age: int = 30 5 height: float = 1.85 ~\anaconda3\lib\dataclasses.py in dataclass[cls, init, repr, eq, order, unsafe_hash, frozen] 1019 1020 # We're called as @dataclass without parens. -> 1021 return wrap[cls] 1022 1023 ~\anaconda3\lib\dataclasses.py in wrap[cls] 1011 1012 def wrap[cls]: -> 1013 return _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 1014 1015 # See if we're being called as @dataclass or @dataclass[]. ~\anaconda3\lib\dataclasses.py in _process_class[cls, init, repr, eq, order, unsafe_hash, frozen] 925 if f._field_type in [_FIELD, _FIELD_INITVAR]] 926 _set_new_attribute[cls, '__init__', --> 927 _init_fn[flds, 928 frozen, 929 has_post_init, ~\anaconda3\lib\dataclasses.py in _init_fn[fields, frozen, has_post_init, self_name, globals] 502 seen_default = True 503 elif seen_default: --> 504 raise TypeError[f'non-default argument {f.name!r} ' 505 'follows default argument'] 506 TypeError: non-default argument 'email' follows default argument
Sử dụng các thuộc tính mặc định và quy tắc của chúng
Tạo phương thức biểu diễn
So sánh các lớp dữ liệu
Sắp xếp các lớp dữ liệu
Sử dụng tính kế thừa với các lớp dữ liệu
Làm việc với các lớp dữ liệu bất biến
Data SciencepythonHướng dẫn
Thông tin về các Tác giả
Otávio Simões Silveira
Otávio là một nhà kinh tế và nhà khoa học dữ liệu đến từ Brazil. Khi rảnh rỗi, anh ấy viết về Python và Khoa học dữ liệu trên internet. Bạn có thể tìm thấy anh ấy tại LinkedIn