2.20. Lớp cơ bản¶
Một lớp nhóm dữ liệu và các hàm hoạt động trên dữ liệu đó dưới một tên duy nhất. Nên sử dụng lớp khi nhiều trạng thái liên quan thuộc về nhau và hầu hết các hàm trong một tập lệnh nhận cùng một tập giá trị đó làm đối số.
2.20.1. Từ khóa class¶
Từ khóa là class. Thân lớp chứa một phương thức __init__ chạy mỗi khi một thể hiện mới được tạo:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Đầu ra:
3 4
Point là lớp; p là một thể hiện của nó. Các dấu ngoặc đơn trong lời gọi Point(3, 4) kích hoạt __init__, gán các đối số cho các thuộc tính của thể hiện mới. self là tên quy ước cho thể hiện; self.x thiết lập một thuộc tính mà các phương thức còn lại của thể hiện sẽ đọc.
2.20.2. Khi nào nên dùng lớp¶
Hãy dùng lớp khi các điều kiện sau đồng thời đúng:
Một vài giá trị liên quan luôn đi cùng nhau (
xvàycủa một điểm; giá trị, đơn vị và dấu thời gian của một lần đọc cảm biến).Nhiều hàm nhận cùng một tập giá trị đó và thao tác trên chúng.
Hữu ích khi giữ nhiều hơn một bundle như vậy cùng tồn tại, phân biệt với nhau.
Nếu dữ liệu chỉ dùng một lần, một dict hay tuple thông thường thường đủ rồi. Nếu bạn chỉ cần một bundle hằng số duy nhất, biến cấp mô-đun là ổn. Lớp không phải là container mặc định -- chúng xứng đáng có mặt khi trạng thái và hành vi muốn gắn kết với nhau.
2.20.3. Vai trò của __init__¶
__init__ chỉ là một phương thức thông thường. Bất cứ thứ gì được gán cho self bên trong nó đều trở thành một thuộc tính của thể hiện mới:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Đầu ra:
temperature C []
readings được khởi tạo thành một danh sách rỗng -- mỗi thể hiện mới nhận danh sách riêng của nó, không phải một danh sách dùng chung. Bất cứ thứ gì không được gán cho self đều là cục bộ với __init__ và biến mất khi hàm trả về.