目录
AttributeError: ‘dict’ object has no attribute in Python
- AttributeError: ‘dict’ 对象没有属性 X
- AttributeError: ‘dict’ 对象没有属性 ‘has_key’
- AttributeError: ‘dict’ 对象没有属性 ‘append’
- AttributeError: ‘dict’ 对象没有属性 ‘read’
AttributeError: ‘dict’ 对象在 Python 中没有属性
Python“AttributeError: ‘dict’ object has no attribute”发生在我们使用点符号而不是括号符号来访问字典中的键时。
要解决该错误,请在访问密钥时使用括号表示法,例如
my_dict['age']
.
下面是错误如何发生的示例。
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
返回
。True
False
错误地将变量重新分配给字典
确保您没有在代码中的某处重新分配变量的值。
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
我们提供了name
和salary
参数并实例化了该类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()
返回,否则返回。True
False
开始调试的一个好方法是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个例子。单击链接导航到副标题。
- AttributeError: ‘dict’ 对象没有属性 ‘has_key’
- AttributeError: ‘dict’ 对象没有属性 ‘append’
- 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')
该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
计算为,否则计算为。True
x
s
False
x
not in返回ins
的否定。x
s
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']
.
AttributeError: ‘dict’ 对象没有属性 ‘append’
当我们尝试在字典上调用append()
方法时,会出现 Python“AttributeError: ‘dict’ object has no attribute ‘append’”
。
要解决该错误,请使用括号表示法将键值对添加到字典或确保append()
在列表上调用该方法。
下面是错误如何发生的示例。
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 时使用该方法。
下面是错误如何发生的示例。
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()
方法,因此导致错误。