Python đối tượng và các khái niệm cốt lõi

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 self tự động
  • Phương thức lớp: dùng @classmethod, nhận cls
  • 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____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

Thẻ: python oop magic-methods duck-typing introspection

Đăng vào ngày 4 tháng 6 lúc 22:29