AttributeError: ‘dict’ 对象在 Python 中没有属性 ‘X’

目录

AttributeError: ‘dict’ object has no attribute in Python

  1. AttributeError: ‘dict’ 对象没有属性 X
  2. AttributeError: ‘dict’ 对象没有属性 ‘has_key’
  3. AttributeError: ‘dict’ 对象没有属性 ‘append’
  4. AttributeError: ‘dict’ 对象没有属性 ‘read’

AttributeError: ‘dict’ 对象在 Python 中没有属性

Python“AttributeError: ‘dict’ object has no attribute”发生在我们使用点符号而不是括号符号来访问字典中的键时。

要解决该错误,请在访问密钥时使用括号表示法,例如
my_dict['age'].

attributeerror 字典对象没有属性

下面是错误如何发生的示例。

主程序
my_dict = {'id': 1, 'name': 'Bobby Hadz', 'age': 30} # ⛔️ AttributeError: 'dict' object has no attribute 'name' print(my_dict.name) # ⛔️ AttributeError: 'dict' object has no attribute 'id' print(my_dict.id)

如果您试图访问字典中的键,请使用括号表示法。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ✅ using bracket notation print(my_dict['name']) # 👉️ "Bobby Hadz" print(my_dict['age']) # 👉️ 30

get()如果键不在字典中,您还可以使用该方法来避免出现错误。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} print(my_dict.get('name')) # 👉️ "Bobby Hadz" print(my_dict.get('age')) # 👉️ 30 print(my_dict.get('another')) # 👉️ None print(my_dict.get('antoher', 'default')) # 👉️ 'default'

如果键在字典中,则 dict.get 方法返回给定键的值,否则返回默认

该方法采用以下 2 个参数:

姓名 描述
钥匙 返回值的键
默认 如果字典中不存在提供的键,则返回默认值(可选)

default如果未提供参数值,则默认为None,因此该get()方法永远不会引发KeyError.

该错误意味着我们正试图访问一个属性或调用一个字典上的方法,但该类没有实现dict

将键值对添加到字典中

如果您尝试
将键值对添加到字典中,请使用方括号表示法。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} my_dict['country'] = 'Austria' my_dict['job'] = 'programmer' # 👇️ {'name': 'Bobby Hadz', 'age': 30, 'country': 'Austria', 'job': 'programmer'} print(my_dict)

括号语法可用于访问键的值以及设置或更新特定键的值。

遍历字典的键值对

如果您需要遍历字典,请使用该items()方法。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} for key, value in my_dict.items(): # name Bobby Hadz # age 30 print(key, value)
确保您没有拼错内置方法的名称,因为方法名称区分大小写。

如果您在遍历字典时尝试从字典中删除项目,请查看以下
文章

检查字典中是否存在键

如果您需要
检查字典中是否存在键,请使用in运算符。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} print('name' in my_dict) # 👉️ True print('age' in my_dict) # 👉️ True print('another' in my_dict) # 👉️ False if 'age' in my_dict: print(my_dict['age']) # 👉️ 30 else: print('The age key does NOT exist')

如果键存在于字典中,则运算符返回,否则in返回
TrueFalse

错误地将变量重新分配给字典

确保您没有在代码中的某处重新分配变量的值。

主程序
my_list = ['a', 'b'] # 👇️ reassign the list to a dictionary by mistake my_list = {'name': 'Bobby Hadz'} # ⛔️ AttributeError: 'dict' object has no attribute my_list.append('c')

我们最初将变量的值设置my_list为列表,但后来将其设置为字典,这导致了错误。

使用类而不是字典

如果您打算使用类而不是字典,请在访问属性之前实例化该类。

主程序
class Employee(): def __init__(self, name, salary): self.name = name self.salary = salary def get_name(self): return self.name emp1 = Employee('bobbyhadz', 100) print(emp1.name) # 👉️ bobbyhadz print(emp1.salary) # 👉️ 100 print(emp1.get_name()) # 👉️ bobbyhadz

我们提供了namesalary参数并实例化了该类Employee

您可以emp1使用点表示法访问实例上的属性。

在访问属性之前检查对象是否包含属性

如果需要检查对象是否包含属性,请使用该hasattr
函数。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} if hasattr(my_dict, 'values'): print(my_dict.values()) # 👉️ dict_values(['Bobby Hadz', 30]) else: print('Attribute not present in object')

hasattr函数

采用以下 2 个参数:

姓名 描述
object 我们要测试属性是否存在的对象
name 对象中要检查的属性的名称

如果字符串是对象属性之一的名称,则函数hasattr()返回,否则返回。TrueFalse

开始调试的一个好方法是print(dir(your_object))查看字典具有哪些属性。

这是打印 a 的属性的示例dict

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # [...'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', # 'pop', 'popitem', 'setdefault', 'update', 'values' ...] print(dir(my_dict))

如果将一个类传递给dir()
函数,它会返回该类属性的名称列表,并递归地返回其基类的属性。

如果您尝试访问不在此列表中的任何属性,您将收到错误。

针对特定方法解决错误的例子

以下是解决具体方法错误的3个例子。单击链接导航到副标题。

  1. AttributeError: ‘dict’ 对象没有属性 ‘has_key’
  2. AttributeError: ‘dict’ 对象没有属性 ‘append’
  3. AttributeError: ‘dict’ 对象没有属性 ‘read’

AttributeError: ‘dict’ 对象没有属性 ‘has_key’

如果出现“AttributeError: ‘dict’ object has no attribute ‘has_key’”错误,请使用运算符in检查字典中是否存在键。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ⛔️ AttributeError: 'dict' object has no attribute 'has_key' if my_dict.has_key('age'): print('Key in dict')

attributeerror 字典对象没有属性有键

has_key方法在 Python 3 中被移除

has_key方法已在 Python 3 中删除,但是,我们可以使用
in operator来检查键是否在字典中。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ✅ Check if a key is in a dictionary if 'age' in my_dict: print('age key is in dictionary') print(my_dict['age']) # 👉️ 30 # ✅ Check if a key is NOT in a dictionary if 'some_key' not in my_dict: print('key is NOT in dictionary')

in 运算符测试成员资格。例如,如果是 的成员
,则
x in s计算为,否则计算为TruexsFalse

xnot in返回ins的否定xs

与字典一起使用时,in运算符会检查对象中是否存在指定的键dict

如果键不存在,您可以使用该get()方法访问字典中的键而无需获取 a
KeyError

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} print(my_dict.get('name')) # 👉️ "Bobyb Hadz" print(my_dict.get('another')) # 👉️ None print(my_dict.get('another', 'default val')) # 👉️ default val

如果键不存在于字典中,该dict.get()方法采用可选的第二个参数作为默认值。

结论

Python“AttributeError: ‘dict’ object has no attribute”发生在我们使用点符号而不是括号符号来访问字典中的键时。

要解决该错误,请在访问密钥时使用括号表示法,例如
my_dict['age'].

  1. AttributeError: ‘dict’ 对象没有属性 ‘append’
  2. AttributeError: ‘dict’ 对象没有属性 ‘read’

AttributeError: ‘dict’ 对象没有属性 ‘append’

当我们尝试在字典上调用append()方法时,会出现 Python“AttributeError: ‘dict’ object has no attribute ‘append’”

要解决该错误,请使用括号表示法将键值对添加到字典或确保append()在列表上调用该方法。

attributeerror 字典对象没有属性追加

下面是错误如何发生的示例。

主程序
my_dict = {'name': 'Alice', 'age': 30} # ⛔️ AttributeError: 'dict' object has no attribute 'append' my_dict.append('country', 'Austria')

使用括号表示法向字典添加键

字典没有append方法。使用括号表示法将键值对添加到字典中。

主程序
my_dict = {'name': 'Alice', 'age': 30} # ✅ add key-value pairs to dict my_dict['country'] = 'Austria' my_dict['prof'] = 'programmer' # {'name': 'Alice', 'age': 30, 'country': 'Austria', 'prof': 'programmer'} print(my_dict) print(my_dict['country']) # 👉️ Austria
括号语法可用于访问键的值以及设置或更新特定键的值。

如果你试图将一个项目添加到列表中,你必须弄清楚变量在哪里分配了字典而不是列表。

声明列表时使用方括号

声明列表时,使用方括号而不是大括号。

主程序
my_list = [] my_list.append('a') my_list.append('b') print(my_list) # 👉️ ['a', 'b']

在调用append.

主程序
my_list = [] # 👇️ reassign to dictionary by mistake my_list = {'name': 'Alice'} # ⛔️ AttributeError: 'dict' object has no attribute 'append' print(my_list.append('hi'))

开始调试的一个好方法是print(dir(your_object))查看字典具有哪些属性。

这是打印 a 的属性的示例dict

主程序
my_dict = {'name': 'Alice', 'age': 30} # [...'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', # 'pop', 'popitem', 'setdefault', 'update', 'values' ...] print(dir(my_dict))

如果将一个类传递给dir()
函数,它会返回该类属性的名称列表,并递归地返回其基类的属性。

如果您尝试访问不在此列表中的任何属性,您将收到错误。

由于dict对象没有append()方法,因此导致错误。

AttributeError: ‘dict’ 对象没有属性 ‘read’

“AttributeError: ‘dict’ object has no attribute ‘read’” 发生在我们尝试访问read字典上的属性时,例如通过将字典传递给
json.load().

要解决该错误,请json.dumps()在尝试将字典转换为 JSON 时使用该方法。

attributeerror 字典对象没有属性读取

下面是错误如何发生的示例。

主程序
import json my_dict = {"name": "Alice", "age": 30} # ⛔️ AttributeError: 'dict' object has no attribute 'read' json_str = json.load(my_dict)

将 Python 对象转换为 JSON 字符串

如果您尝试将 Python 对象转换为 JSON 字符串,请使用该
json.dumps()方法。

主程序
import json my_dict = {"name": "Alice", "age": 30} json_str = json.dumps(my_dict) print(json_str) # 👉️ '{"name": "Alice", "age": 30}'' print(type(json_str)) # 👉️ <class 'str'>

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

json.loads方法JSON 字符串解析为本机 Python 对象。

主程序
import json json_str = r'{"name": "Alice", "age": 30}' my_dict = json.loads(json_str) print(type(my_dict)) # 👉️ <class 'dict'>

如果正在解析的数据不是有效的 JSON 字符串,JSONDecodeError则会引发 a 。

使用 json.load() 反序列化一个文件

如果您尝试使用该json.load()方法将文件反序列化为 Python 对象,请打开文件并将文件对象传递给该json.load()
方法。

主程序
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) print(my_data) # 👉️ {'name': 'Alice', 'age': 30}

json.load方法用于将文件反序列化为 Python 对象,而
json.loads方法用于将 JSON 字符串反序列化为 Python 对象

json.load()方法需要一个包含实现方法的 JSON 文档的文本文件或二进制文件.read()如果您json.load()使用字典调用该方法,它会尝试调用read()字典上的方法。

开始调试的一个好方法是print(dir(your_object))查看字典具有哪些属性。

这是打印 a 的属性的示例dict

主程序
my_dict = {'name': 'Alice', 'age': 30} # [...'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', # 'pop', 'popitem', 'setdefault', 'update', 'values' ...] print(dir(my_dict))

如果将一个类传递给dir()
函数,它会返回该类属性的名称列表,并递归地返回其基类的属性。

如果您尝试访问不在此列表中的任何属性,您将收到错误。

由于dict对象没有read()方法,因此导致错误。