Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Lớp Metaclass trong Python
Trong bài viết này, bạn sẽ tìm hiểu về lớp metaclass trong Python và vai trò quan trọng của nó trong quá trình tạo ra các lớp khác. Metaclass là một cơ chế mạnh mẽ trong Python, giúp bạn tùy chỉnh quá trình tạo ra lớp, từ đó có thể kiểm soát và thêm logic đặc biệt vào quá trình khởi tạo lớp. Bằng cách hiểu cách Python sử dụng metaclass, bạn có thể mở rộng khả năng lập trình của mình để xây dựng các hệ thống phức tạp hơn một cách linh hoạt và có tổ chức hơn.

Giới thiệu về Metaclass trong Python
Metaclass là một lớp được sử dụng để tạo ra các lớp khác. Mặc định, Python sử dụng lớp metaclass type để tạo ra các lớp mới.
Ví dụ, hãy xem đoạn mã định nghĩa lớp Person dưới đây:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Khi Python thực thi đoạn mã trên, nó sử dụng metaclass type để tạo ra lớp Person. Lý do là vì lớp Person sử dụng metaclass type theo mặc định.
Bài viết này được đăng tại [free tuts .net]
Cụ thể, định nghĩa lớp Person có thể được viết lại một cách rõ ràng như sau:
class Person(object, metaclass=type):
def __init__(self, name, age):
self.name = name
self.age = age
Tham số metaclass cho phép bạn chỉ định lớp metaclass nào sẽ được sử dụng để định nghĩa lớp đó. Nhờ vậy, bạn có thể tạo ra một metaclass tùy chỉnh với logic riêng để tạo ra các lớp. Bằng cách sử dụng metaclass tùy chỉnh, bạn có thể thêm tính năng vào quá trình tạo lớp.
Ví dụ về metaclass trong Python
Đầu tiên, hãy định nghĩa một metaclass tùy chỉnh tên là Human, trong đó thuộc tính freedom (tự do) được thiết lập mặc định là True:
class Human(type):
def __new__(mcs, name, bases, class_dict):
class_ = super().__new__(mcs, name, bases, class_dict)
class_.freedom = True
return class_
Lưu ý rằng phương thức __new__ sẽ trả về một lớp mới hoặc một đối tượng lớp.
Tiếp theo, định nghĩa lớp Person sử dụng metaclass Human:
class Person(object, metaclass=Human):
def __init__(self, name, age):
self.name = name
self.age = age
Lớp Person sẽ có thuộc tính freedom như đã thiết lập trong biến của lớp:
from pprint import pprint pprint(Person.__dict__)
Kết quả sẽ là:
mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
'__doc__': None,
'__init__': <function Person.__init__ at 0x000001E716C71670>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'freedom': True})
Truyền tham số vào metaclass trong Python
Để truyền tham số cho metaclass, bạn có thể sử dụng từ khóa kwargs. Ví dụ, định nghĩa lại metaclass Human để nhận các tham số từ khóa, trong đó mỗi tham số trở thành một biến của lớp:
class Human(type):
def __new__(mcs, name, bases, class_dict, **kwargs):
class_ = super().__new__(mcs, name, bases, class_dict)
if kwargs:
for name, value in kwargs.items():
setattr(class_, name, value)
return class_
Ví dụ, lớp Person sẽ có các biến lớp country (quốc gia) và freedom được thiết lập lần lượt là 'USA' và True:
class Person(object, metaclass=Human, country='USA', freedom=True):
def __init__(self, name, age):
self.name = name
self.age = age
Kết quả là:
from pprint import pprint pprint(Person.__dict__)
Kết quả:
mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
'__doc__': None,
'__init__': <function Person.__init__ at 0x0000018A334235E0>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'country': 'USA',
'freedom': True})
Khi nào nên sử dụng metaclass trong Python
Một trích dẫn từ Tim Peter, tác giả của "Zen of Python":
"Metaclass là một phép thuật sâu xa mà 99% người dùng không bao giờ cần quan tâm. Nếu bạn tự hỏi liệu bạn có cần nó không, câu trả lời là không. Những người thực sự cần metaclass biết chắc chắn rằng họ cần nó và không cần một lời giải thích về lý do tại sao."
Trên thực tế, bạn thường không cần sử dụng metaclass trừ khi bạn đang duy trì hoặc phát triển các framework lớn như Django.
Kết bài
Metaclass là một khái niệm đặc biệt trong Python, giúp điều khiển quá trình tạo ra các lớp khác. Lớp type là metaclass mặc định trong Python, chịu trách nhiệm tạo và khởi tạo các lớp. Thông qua việc hiểu và sử dụng metaclass, bạn có thể tùy chỉnh quá trình khởi tạo lớp, mang lại tính linh hoạt và khả năng kiểm soát cao hơn trong việc xây dựng các ứng dụng phức tạp. Tuy nhiên, metaclass thường chỉ cần thiết khi làm việc với những hệ thống lớn hoặc các framework phức tạp như Django.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng