3.1 Tạo lớp
Tạo lớp trong Python là một phần quan trọng của lập trình hướng đối tượng (OOP). Lớp cho phép tạo ra các kiểu dữ liệu mới, có thể có các thuộc tính và phương thức riêng. Hãy cùng xem qua những khái niệm cơ bản và ví dụ về cách tạo lớp trong Python.
Khái niệm cơ bản
- Lớp: mẫu để tạo đối tượng. Lớp xác định các thuộc tính và phương thức mà đối tượng của lớp đó sẽ có.
- Đối tượng: một instance của lớp. Đối tượng có tất cả các thuộc tính và phương thức được định nghĩa trong lớp.
- Thuộc tính: biến được liên kết với lớp hoặc đối tượng.
- Phương thức: hàm được liên kết với lớp hoặc đối tượng.
Thuộc tính về bản chất là các biến nội bộ của đối tượng hoặc lớp. Phương thức là các hàm được định nghĩa bên trong lớp. Những thuật ngữ này xuất phát từ OOP và được sử dụng cùng với hàm và biến.
Để khai báo (tạo) một lớp mới, ta sử dụng từ khóa class
. Cú pháp chung của thao tác này trông như sau:
class TênLớp:
biến1 = giá_trị1
biếnN = giá_trịN
def hàm1(self):
mã hàm
def hàmM(self):
mã hàm
Về cơ bản, có thể nói rằng lớp là một chương trình nhỏ (biến + hàm), được đặt trong một khu vực riêng có tên - TênLớp.
Sau khi bạn đã tạo lớp, bạn có thể tạo đối tượng (instance) của lớp đó. Mã này còn trông dễ dàng hơn:
biếnX = TênLớp()
Quan trọng!
Tên biến và phương thức trong Python thường được viết bằng chữ thường. Tên lớp - chữ hoa. Cũng không sử dụng gạch dưới trong tên lớp. Nếu tên lớp phải có nhiều từ, mỗi từ sẽ viết hoa.
Nếu bạn muốn truy cập vào một biến lớp/đối tượng, thì mã này thường trông như sau:
biếnX.biến1 = 10
biếnX.hàmM()
Nhưng có một số chi tiết phức tạp hơn, như sẽ nói dưới đây…
3.2 Làm việc với đối tượng
Cả lớp và instance của lớp (đối tượng của lớp) đều là các object, vì vậy cả hai có thể có biến và phương thức riêng.
Có hai loại biến:
-
Thuộc tính/Biến/Trường của lớp
(class property)
-
Thuộc tính/Biến/Trường của đối tượng
(object property)
Và có ba loại phương thức:
-
Phương thức/Hàm của lớp
(class method)
-
Phương thức/Hàm của đối tượng
(instance method)
-
Phương thức tĩnh
(static method)
Phương thức khác nhau về cách khai báo và gọi chúng.
Phương thức của đối tượng
Khi khai báo phương thức đối tượng, bạn cần truyền vào tham số bắt buộc đầu tiên là self
. Khi gọi phương thức, tham số này được truyền tham chiếu đến đối tượng (instance
).
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
Trong ví dụ trên, khi hàm instance_method()
bắt đầu thực thi, tham số self
đã được truyền tham chiếu tới đối tượng my_object
.
Phương thức của lớp
Khi khai báo phương thức của lớp, bạn cũng cần truyền vào tham số bắt buộc đầu tiên là cls
. Khi gọi phương thức, tham số này được truyền tham chiếu tới đối tượng lớp (class object
). Ngoài ra, phương thức của lớp cần được gắn thêm decorator classmethod
, như trong ví dụ dưới đây:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
Trong ví dụ trên, khi hàm
class_method()
bắt đầu thực thi, tham số
cls
đã được truyền tham chiếu tới lớp
MyClass
.
Phương thức tĩnh
Khi khai báo phương thức tĩnh, bạn không cần truyền gì vào, nhưng nó cũng sẽ không thể truy cập vào dữ liệu nội bộ của lớp. Ngoài ra, phương thức cần được gắn thêm decorator
staticmethod
, như trong ví dụ dưới đây:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "Phương thức này không phụ thuộc vào instance hay lớp"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
Phương thức tĩnh được gọi rất giống với phương thức của lớp, nhưng tham chiếu đối tượng hay tham chiếu lớp đều không được truyền vào.
3.3 Biến lớp
Biến lớp
Để khai báo một biến (thuộc tính) của lớp, chỉ cần khai báo nó ở bất kỳ đâu trong lớp. Thông thường sẽ làm điều này ở đầu, trước khi khai báo các phương thức của lớp. Ví dụ:
class MyClass:
attribute = "Tôi là thuộc tính của lớp"
@classmethod
def class_method(cls):
print(cls.attribute) # Tôi là thuộc tính của lớp
my_object = MyClass()
MyClass.class_method()
Nếu bạn muốn đọc hoặc ghi giá trị vào một biến lớp, hãy sử dụng đối tượng cls
.
Thực tế, có thể truy cập vào biến lớp thông qua tên của lớp:
class MyClass:
attribute = "Tôi là thuộc tính của lớp"
@classmethod
def class_method(cls):
print(MyClass.attribute) # Tôi là thuộc tính của lớp
my_object = MyClass()
print(MyClass.attribute) # Tôi là thuộc tính của lớp
Biến/trường của đối tượng
Biến đối tượng (instance)
- là các trường của đối tượng self
. Bạn chỉ cần làm việc với chúng thông qua self.name
. Đây chính là lý do đối tượng self
được truyền vào mỗi phương thức của đối tượng.
Ví dụ:
class MyClass:
attribute = "Tôi là thuộc tính của lớp"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("Trường đối tượng có tên là name")
my_object.print_name() # "Trường đối tượng có tên là name"
Mỗi lần bạn gọi phương thức đối tượng, tham chiếu đến đối tượng, trên đó bạn gọi phương thức, được truyền vào như tham số đầu tiên (self)
. Các phương thức khác nhau của đối tượng có thể truy cập dữ liệu chung thông qua việc sử dụng đối tượng self
.
GO TO FULL VERSION