Thuộc tính (Attributes) là giá trị hoặc hàm liên kết với đối tượng, kiểu dữ liệu, hoặc lớp. Nếu bạn gọi thuộc tính trên giá trị có kiểu dữ liệu hoặc lớp không hỗ trợ thuộc tính đó, bạn sẽ gặp AttributeError.
Hướng dẫn này thảo luận AttributeError là gì và ý nghĩa của nó. Chúng ta sẽ đi qua ví dụ AttributeError để bạn học cách sửa trong mã.
Python AttributeError là gì?
Python AttributeError bị ném ra khi bạn cố gọi thuộc tính của đối tượng có kiểu không hỗ trợ phương thức đó. Ví dụ, cố dùng phương thức append() Python trên chuỗi trả về AttributeError vì chuỗi không hỗ trợ append().
Trong lớp Python, bạn có thể định nghĩa phương thức và giá trị dùng chung bởi các đối tượng của lớp đó. Đó là lý do một số người nghĩ lớp như bản thiết kế (blueprint) cho đối tượng.
Gọi phương thức hoặc lớp là cách khác nói bạn đang tham chiếu thuộc tính của lớp đó. Cách suy nghĩ về thuộc tính giống như thuộc tính vật lý của con người. Một số người có mắt xanh. Một số người tóc hồng. Tất cả đều là thuộc tính.
Trong lớp Python, thuộc tính có thể là "eye_color". Thuộc tính này định nghĩa màu mắt người. Thuộc tính cũng có thể là hàm. Hàm changeEyeColor() có thể thay đổi giá trị "eye_color".
Kiểu dữ liệu có thuộc tính. Ví dụ, bạn có thể dùng phương thức join() Python chuyển danh sách thành chuỗi. Đối tượng chuỗi hỗ trợ phương thức join().
Nếu bạn cố tham chiếu hàm hoặc giá trị không liên kết với đối tượng lớp hoặc kiểu dữ liệu, bạn sẽ gặp AttributeError.
Ví dụ Attribute Error Python
Hãy viết chương trình gộp hai danh sách giày. Hai cửa hàng giày đang sáp nhập và muốn tạo danh sách tất cả giày độc nhất họ bán.
Đầu tiên, định nghĩa tập hợp (set) Python chứa giày từ cửa hàng một, Harrisons Shoes:
harrisons_shoes = {"Nike Air Force 1 07", "Nike Air Max Plus", "Adidas Gazelle"}
Chúng ta dùng ngoặc nhọn định nghĩa tập hợp. Tiếp theo, định nghĩa tập hợp tên giày từ cửa hàng sáp nhập với Harrisons. Cửa hàng này tên Shoe Emporium:
shoe_emporium = {"Adidas Samba", "Adidas Superstar", "Nike Air Max Plus"}
Vì hai tập hợp này là sets, chúng chỉ lưu giá trị duy nhất. Nghĩa là khi gộp chúng, ta được tập hợp không có giá trị trùng lặp.
Để gộp hai tập hợp, dùng hàm tích hợp sẵn extend():
harrisons_shoes.extend(shoe_emporium) print(harrisons_shoes)
Phương thức extend() thêm tất cả giày từ tập hợp "shoe_emporium" vào tập hợp "harrisons_shoes". Dùng câu lệnh print() Python để xem tất cả giày trong tập hợp mới. Chạy mã xem sao:
Traceback (most recent call last): File "main.py", line 3, inharrisons_shoes.extend(shoe_emporium) AttributeError: 'set' object has no attribute 'extend'
Mã trả về AttributeError.
Giải pháp AttributeError Python
Thông báo lỗi nói chúng ta không thể dùng phương thức extend() trên đối tượng kiểu dữ liệu set. Điều này vì extend() là phương thức danh sách (list method). Nó không được hỗ trợ bởi sets.
Nếu muốn gộp hai tập hợp, phải dùng dấu cộng hoặc phương thức update():
harrisons_shoes.update(shoe_emporium) print(harrisons_shoes)
Điều này sẽ thêm nội dung tập hợp "shoe_emporium" vào tập hợp "harrisons_shoes". Sau đó in tất cả giá trị trong tập hợp "harrisons_shoes" ra bảng điều khiển. Chạy chương trình mới:
{'Nike Air Force 1 07', 'Adidas Superstar', 'Adidas Samba', 'Nike Air Max Plus', 'Adidas Gazelle'}
Chương trình trả về tập hợp với tất cả giày từ hai tập hợp gốc. Mặc dù có sáu giá trị trong hai tập hợp gốc, giờ chỉ còn năm. Vì hai giày giống nhau và tập hợp chỉ lưu giá trị duy nhất.
Chương trình trả về tập hợp với tất cả giày từ hai tập hợp gốc. Mặc dù có sáu giá trị trong hai tập hợp gốc, giờ chỉ còn năm. Vì hai giày giống nhau và tập hợp chỉ lưu giá trị duy nhất.
Các AttributeError tương tự để khám phá
AttributeErrors cực kỳ phổ biến. Chúng có thể nảy sinh khi bạn cố gọi thuộc tính của kiểu dữ liệu và lớp không hỗ trợ thuộc tính bạn tham chiếu.
Những lỗi này cũng có thể do lỗi đánh máy khi tham chiếu thuộc tính. Python diễn giải mã như nó là. Nếu bạn lỡ đánh máy, Python sẽ thấy bạn tham chiếu thuộc tính không tồn tại.
Ví dụ, dùng phương thức split() Python tách danh sách là phổ biến. Nhưng split() là phương thức chuỗi nên không thể dùng tách danh sách.
Để đọc thêm, hãy tìm hiểu các lỗi sau:
- AttributeError: 'list' object has no attribute 'split'
- AttributeError: 'module' object has no attribute 'urlopen'
Kết luận
Lỗi thuộc tính (Attribute errors) trong Python bị ném ra khi tham chiếu thuộc tính không hợp lệ. Để giải quyết, trước tiên kiểm tra thuộc tính bạn gọi có tồn tại không. Sau đó, đảm bảo thuộc tính liên quan đến đối tượng hoặc kiểu dữ liệu bạn đang làm việc.
Nếu thuộc tính bạn muốn liên quan đến kiểu tích hợp sẵn và không tồn tại, hãy tìm phương án thay thế. Có phương án thay thế cho nhiều thuộc tính tồn tại cho một kiểu dữ liệu bạn có thể dùng trên kiểu khác. Ví dụ, không có phương thức extend() với sets nhưng bạn có thể dùng union() gộp hai tập hợp.
Để tìm hiểu thêm về viết mã Python, đọc hướng dẫn How to Learn Python của chúng tôi.