2012-06-06 28 views
5

thể trùng lặp:
Why can't I directly add attributes to any python object?
Why can't you add attributes to object in python?điều gì làm cho đối tượng được người dùng xác định không ném AttributeError bằng Python?

Các mã sau đây không ném AttributeError

class MyClass(): 
    def __init__(self): 
     self.a = 'A' 
     self.b = 'B' 
my_obj = MyClass() 
my_obj.c = 'C' 

Đó trái ngược với

>>> {}.a = 'A' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'a' 

Điều gì tạo ra sự khác biệt như vậy? Có phải về dict là lớp được xây dựng trong khi MyClass được người dùng xác định không?

+1

Câu hỏi thực sự là nhiều hơn * điều gì làm cho một số đối tượng ném thuộc tính khi thiết lập * - Python là động, vì vậy bạn có thể làm điều này một cách tự nhiên, không phải cách khác. –

+0

có thể trùng lặp: http://stackoverflow.com/questions/1285269/why-cant-you-add-attributes-to-object-in-python http://stackoverflow.com/questions/1072649/python-language-question -attributes-of-object-vs-function – mgilson

+0

Liên kết đầu tiên được đưa ra bởi mgilson ở trên có một câu trả lời tốt. –

Trả lời

2

Sự khác biệt là trường hợp các lớp do người dùng định nghĩa có từ điển thuộc tính được liên kết với chúng theo mặc định. Bạn có thể truy cập từ điển này bằng cách sử dụng vars(my_obj) hoặc my_obj.__dict__. Bạn có thể ngăn việc tạo ra một từ điển thuộc tính bằng cách định nghĩa __slots__:

class MyClass(object): 
    __slots__ = [] 

Built-in loại cũng có thể cung cấp một cuốn từ điển thuộc tính, nhưng thường họ không. Ví dụ về kiểu tích hợp mà thực hiện thuộc tính hỗ trợ là loại hàm.

Các vấn đề liên quan