Tôi đã thấy hai đối tượng Python khác nhau được sử dụng để nhóm dữ liệu tùy ý với nhau: các lớp và chức năng trống.Tại sao các lớp và hàm rỗng của Python hoạt động như các thùng chứa dữ liệu tùy ý, nhưng không phải là các đối tượng khác?
def struct():
pass
record = struct
record.number = 3
record.name = "Zoe"
class Struct:
pass
record = Struct()
record.number = 3
record.name = "Zoe"
Ngay cả khi lớp học không trống, nó có vẻ hoạt động miễn là được xác định khi chạy.
Nhưng khi tôi đã tự mãn và cố gắng làm điều này với các hàm hoặc lớp được cài sẵn, nó không hoạt động.
record = set()
record.number = 3
AttributeError: 'set' object has no attribute 'number'
record = pow
pow.number = 3
AttributeError: 'builtin_function_or_method' object has no attribute 'number'
Có sự khác biệt cơ bản giữa các lớp và chức năng được cài sẵn và "tùy chỉnh" có tính đến hành vi này không?
Có một lỗi trong ví dụ đầu tiên của bạn: nó nên được 'kỷ lục = struct' withouth các'() ', nếu không 'record' sẽ là' None' và dòng tiếp theo sẽ ném một ngoại lệ. Ngoài ra, cần lưu ý rằng việc sử dụng các hàm chỉ hoạt động vì hàm do người dùng định nghĩa chỉ là một đối tượng khác trong python, nghĩa là bạn có thể gán các thuộc tính tùy ý. Nếu hàm trống hoặc không có gì để làm với nó. Nhưng trong khi bạn có thể sử dụng điều này cho một số ma thuật lập trình siêu năng động, tôi không thể nghĩ ra lý do tại sao sử dụng một chức năng như một thùng chứa lưu trữ sẽ thích hợp hơn một lớp ... – l4mpi
@ l4mpi Tôi nghĩ rằng nó hữu ích nếu bạn muốn mô phỏng các bao đóng mà "ghi" vào phạm vi kèm theo của chúng trong Python 2.x, trước 'nonlocal'. Bạn sử dụng các thuộc tính ad-hoc của đối tượng hàm cục bộ thay vì các vars cục bộ. – millimoose
Rất tiếc, bạn nói đúng về ví dụ đầu tiên. –