解析Python中字典["id"]与对象.id访问元素的差异
Python中字典键访问与对象属性访问的区别
核心差异总结
适用对象不同
blog_post["id"]是字典类型的键值对访问方式,仅能用于字典(比如你给出的{"id":1, ...}这种结构);blog_post.id是类实例对象的属性访问方式,仅能用于自定义类的实例(比如代码中post_objects里的元素,应该是某个BlogPost类创建的对象)。错误类型与容错逻辑不同
- 用字典键访问时,如果键不存在,会直接抛出
KeyError; - 用对象属性访问时,如果属性不存在,会抛出
AttributeError。
另外,字典的键可以是任意不可变类型(比如数字、字符串、元组),但对象属性名必须符合Python标识符规则(不能以数字开头,只能包含字母、数字、下划线)。
- 用字典键访问时,如果键不存在,会直接抛出
赋值与扩展规则不同
- 字典可以动态添加新键:比如
blog_post["new_field"] = "content",直接就能给字典新增键值对; - 对象动态添加属性要看类的定义:普通类实例可以直接
blog_post.new_field = "content",但如果类用__slots__限制了属性,或者是dataclass这类结构化类,就无法随意新增属性。
- 字典可以动态添加新键:比如
结合你的代码示例说明
- 代码中
show_post函数里的blog_post.id,说明post_objects中的元素是类实例(比如定义了class BlogPost: def __init__(self, id, title, ...): self.id = id; ...),所以可以通过.id访问对象的属性。 - 而你给出的字典结构
{"id":1, "body":...},要获取id必须用blog_post["id"],如果尝试用.id访问,会抛出AttributeError: 'dict' object has no attribute 'id'的错误。
内容的提问来源于stack exchange,提问作者Justine Robin
相关产品推荐
相关产品推荐

