INTRODUCTION
FLOW CONTROL
FUNCTIONS
DATATYPES
OBJECT & CLASS
Bài tập Python: Lập trình hướng đối tượng (OOP) trong Python Lập trình hướng đối tượng trong Python Class Variables trong Python Tìm hiểu về Methods trong Python Cách sử dụng phương thức __init__() trong Python Các biến Instance trong Python Tìm hiểu về Class Attributes trong Python Hàm Static Methods trong Python Phương thức __str__ trong Python Phương thức __repr__ trong Python Phương thức eq trong Python Tìm hiểu phương thức __hash__ trong Python Phương thức __bool__ trong Python Phương thức del trong Python Tìm hiểu về lớp Property trong Python Tìm hiểu về nạp chồng toán tử trong Python Trình Decorator Property trong Python Thuộc tính chỉ đọc trong Python Thuộc tính Delete trong Python Sử dụng super() trong Python Sử dụng __slots__ trong Python Cách sử dụng Protocol trong Python Sử dụng Enum aliases và @enum.unique trong Python Tùy chỉnh và mở rộng lớp Enum trong Python Cách sử dụng hàm Auto() của Python Single Responsibility Principle trong Python Nguyên tắc Đóng-Mở trong Python Nguyên tắc thay thế Liskov - LSP trong Python Interface Segregation Principle - ISP trong Python. Nguyên tắc đảo ngược sự phụ thuộc trong Python Đa kế thừa trong Python Tìm hiểu về các lớp mixin trong Python Mô tả Descriptors trong Python Phân biệt Data Descriptor và Non-data Descriptor trong Python Phương thức __new__ trong Python Tìm hiểu về Class Type trong Python Lớp Metaclass trong Python Ví dụ sử dụng metaclass trong Python Tìm hiểu về decorator dataclass trong Python Tìm hiểu về các ngoại lệ trong Python Ngoại lệ Raise trong Python Sử dụng câu lệnh raise from trong Python Ngoại lệ tùy chỉnh trong Python Module trong Python Package trong Python Class trong Python Hàm khởi tạo trong Python Kế thừa trong Python Đa kế thừa trong Python Setter và Getter trong Python Override trong Python Interface trong Python Bài tập Python: Module và Class
ADVANCED TOPICS
BỔ SUNG
PYTHON CĂN BẢN
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Tìm hiểu về Methods trong Python

Trong bài viết này, bạn sẽ tìm hiểu về các phương thức (methods) trong Python, cách chúng hoạt động, và sự khác biệt giữa phương thức và hàm. Phương thức là một khái niệm quan trọng trong lập trình hướng đối tượng, giúp bạn thao tác với các đối tượng và làm việc với các lớp một cách hiệu quả hơn. Qua đó, bạn sẽ hiểu rõ hơn cách Python tự động quản lý và truyền đối tượng trong các phương thức, cũng như cách sử dụng self để truy cập đối tượng bên trong lớp.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về phương thức (methods) trong Python

Theo định nghĩa, một phương thức là một hàm được liên kết với một thể hiện của một lớp (class). Trong bài hướng dẫn này, bạn sẽ hiểu cách phương thức hoạt động bên dưới lớp.

Hãy xem ví dụ về lớp Request chứa hàm send() dưới đây:

class Request:
    def send():
        print('Đã gửi')

Bạn có thể gọi hàm send() thông qua lớp Request như sau:

Bài viết này được đăng tại [free tuts .net]

Request.send()  # Đã gửi

Hàm send() ở đây là một đối tượng hàm (function object), tức là một thể hiện của lớp function, như bạn có thể thấy qua đầu ra sau:

print(Request.send)

Kết quả:

<function Request.send at 0x00000276F9E00310>

Kiểu của send là một hàm:

print(type(Request.send))  # <class 'function'>

Phương thức ràng buộc với một đối tượng trong Python

Giờ hãy tạo một thể hiện mới của lớp Request:

http_request = Request()

Nếu bạn hiển thị http_request.send, bạn sẽ nhận được một đối tượng phương thức ràng buộc (bound method object):

print(http_request.send)

Kết quả:

<bound method Request.send of <__main__.Request object at 0x00000104B6C3D580>>

Do đó, http_request.send không phải là một hàm như Request.send. Kiểm tra xem hai đối tượng này có giống nhau hay không sẽ trả về False như mong đợi:

print(type(Request.send) is type(http_request.send))  # False

Lý do là kiểu của Request.sendfunction, trong khi kiểu của http_request.sendmethod:

print(type(http_request.send))  # <class 'method'>
print(type(Request.send))  # <class 'function'>

Như vậy, khi bạn định nghĩa một hàm bên trong một lớp, nó chỉ là một hàm. Tuy nhiên, khi bạn truy cập hàm đó thông qua một đối tượng, hàm sẽ trở thành một phương thức.

Do đó, một phương thức là một hàm được ràng buộc với một thể hiện của lớp.

Cách phương thức hoạt động

Nếu bạn gọi phương thức send() thông qua đối tượng http_request, bạn sẽ gặp lỗi TypeError như sau:

http_request.send()

Lỗi:

TypeError: send() takes 0 positional arguments but 1 was given

Nguyên nhân là vì khi bạn gọi một phương thức qua đối tượng, Python sẽ tự động truyền đối tượng đó vào phương thức dưới dạng đối số đầu tiên.

Hãy định nghĩa lại lớp Request để phương thức send() chấp nhận danh sách đối số:

class Request:
    def send(*args):
        print('Đã gửi', args)

Nếu bạn gọi phương thức send() từ lớp Request, danh sách đối số sẽ trống:

Request.send()  # Đã gửi ()

Tuy nhiên, khi gọi từ một thể hiện của lớp, danh sách đối số sẽ không trống:

http_request.send()  # Đã gửi (<__main__.Request object at 0x000001374AF4D580>,)

Trong trường hợp này, đối tượng http_request đã được truyền vào như là đối số đầu tiên của phương thức send().

Bạn có thể kiểm tra xem đối tượng được truyền vào có giống với đối tượng gọi phương thức không:

print(hex(id(http_request)))  # In địa chỉ bộ nhớ của đối tượng
http_request.send()

Kết quả:

0x1ee3a74d580
Đã gửi (<__main__.Request object at 0x000001EE3A74D580>,)

Địa chỉ bộ nhớ của đối tượng http_request giống với đối tượng được truyền vào phương thức send().

Tên gọi self trong Python

Như vậy, phương thức của một đối tượng luôn có đối tượng đó làm đối số đầu tiên. Theo quy ước, đối số này được gọi là self:

class Request:
    def send(self):
        print('Đã gửi', self)

Nếu bạn từng làm việc với các ngôn ngữ lập trình khác như Java hay C#, self tương tự như this trong các ngôn ngữ đó.

Kết bài

Tóm lại, phương thức trong Python đóng vai trò quan trọng trong lập trình hướng đối tượng, giúp bạn dễ dàng thao tác với các đối tượng và dữ liệu của chúng. Khi một hàm trở thành phương thức, nó được ràng buộc với một đối tượng cụ thể và có khả năng truy cập mọi thuộc tính, phương thức khác của đối tượng đó thông qua đối số self. Hiểu rõ cách thức hoạt động của phương thức và vai trò của self sẽ giúp bạn viết mã hiệu quả, tổ chức logic chương trình rõ ràng và dễ bảo trì hơn.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top