Trong Python, mọi thứ đều là đối tượng — kể cả hàm và lớp — và được xem như công dân hạng nhất. Điều này cho phép:
- Gán đối tượng vào biến
- Thêm vào cấu trúc tập hợp
- Truyền làm tham số hàm
- Trả về từ hàm
Mỗi đối tượng có ba đặc điểm: danh tính (dùng id()), kiểu dữ liệu, và giá trị.
Mọi lớp trong Python đều kế thừa từ object, và chính type cũng là một lớp — đồng thời là một đối tượng. Mối quan hệ phân cấp thể hiện rõ qua ví dụ sau:
x = 42
text = "hello"
print(type(x)) # <class 'int'>
print(type(int)) # <class 'type'>
print(type(text)) # <class 'str'>
print(type(str)) # <class 'type'>
class Person:
pass
class Employee(Person):
pass
emp = Person()
print(type(emp)) # <class '__main__.Person'>
print(type(Person)) # <class 'type'>
print(int.__bases__) # (<class 'object'>,)
print(str.__bases__) # (<class 'object'>,)
print(Person.__bases__) # (<class 'object'>,)
print(Employee.__bases__) # (<class '__main__.Person'>,)
print(type.__bases__) # (<class 'object'>,)
print(object.__bases__) # ()
print(type(object)) # <class 'type'>
print(type(type)) # <class 'type'>
def greet():
pass
print(greet.__class__) # <class 'function'>
print(type(greet.__class__)) # <class 'type'>
Các kiểu dựng sẵn phổ biến
None— duy nhất trong toàn chương trình- Số học:
int,float,complex,bool - Chuỗi và dãy:
str,list,tuple,range,bytes,bytearray,memoryview - Tập hợp:
set,frozenset - Kiểu khác: module, class, instance, hàm, phương thức, code object,
type,ellipsis,NotImplemented
Phương thức đặc biệt và Duck Typing
Phương thức đặc biệt (magic methods) được Python tự động gọi để mở rộng hành vi lớp. Ví dụ, bạn không cần gọi __init__ — Python sẽ gọi khi khởi tạo.
Duck typing — kiểu động của Python — chú trọng vào hành vi hơn là kiểu dữ liệu:
class Cat:
def speak(self):
print("Meow")
class Dog:
def speak(self):
print("Woof")
class Duck:
def speak(self):
print("Quack")
creatures = [Cat, Dog, Duck]
for creature in creatures:
creature().speak()
# Output:
# Meow
# Woof
# Quack
Lớp cơ sở trừu tượng và phương thức
Lớp cơ sở trừu tượng giúp kiểm tra kiểu (isinstance) hoặc ép lớp con triển khai phương thức bắt buộc.
Phân biệt ba loại phương thức:
- Phương thức thực thể: gọi qua instance, truyền
selftự động - Phương thức lớp: dùng
@classmethod, nhậncls - Phương thức tĩnh: dùng
@staticmethod, không ràng buộc
Biến "riêng tư" được bảo vệ bằng cách đổi tên thành _TênLớp__tên_biến.
Tự kiểm tra đối tượng
Python hỗ trợ introspection — khám phá cấu trúc đối tượng tại runtime:
class Member:
def __init__(self, years):
self.__years = years
def get_years(self):
return self.__years
member = Member(25)
print(member.__dict__) # {'_Member__years': 25}
print(dir(member)) # Danh sách tất cả thuộc tính và phương thức
Kế thừa đa cấp và Mixin
Hàm super() tuân theo thứ tự MRO (__mro__). Khi dùng kế thừa đa cấp, khuyến nghị dùng Mixin — lớp chức năng đơn, không phụ thuộc base class, và tránh dùng super() trong Mixin.
Quản lý ngữ cảnh
Triển khai giao thức quản lý ngữ cảnh qua __enter__ và __exit__:
class Resource:
def __enter__(self):
print("Acquiring resource")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Releasing resource")
def operate(self):
print("Performing operation")
with Resource() as res:
res.operate()
# Output:
# Acquiring resource
# Performing operation
# Releasing resource
Hoặc dùng decorator @contextmanager với generator:
import contextlib
@contextlib.contextmanager
def manage_file(name):
print(f"Opening {name}")
yield
print(f"Closing {name}")
with manage_file("demo.txt") as f:
print("Processing file")
# Output:
# Opening demo.txt
# Processing file
# Closing demo.txt