Python:AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘的修改
这是翻译出来的东西,类型错误,说这个对象没有这个属性
目录
作者的感受
在以前可能也遇到过这样的问题,但是经过了一段时间的面向对象的重新学习,我又遇到了这个问题,发现不总结不行啊,需要总结解决办法以及出现的原因,给自己以后的使用提供一点的借鉴经验。
错误原因
错误的主要原因是初始化以及作用域访问。
一、该属性的初始化错误
1.未初始化
比如你要调用一个属性,但是你忘记了初始化,那它就会告诉你这个错误
# 定义一个类
class MyClass:
# 定义方法
def my_method(self):
try:
self.x # 未初始化就使用
print(self.x)
except Exception as e:
print('异常:'+str(e))
# 创建对象
my_instance = MyClass()
# 通过对象调用方法
my_instance.my_method()
2.初始化为空
如下是一个我的代码示例,使用pymysql和json文件,因为初始化为空,导致错误
这是database_conn文件
import pymysql
import json
class DatabaseConnection:
def __init__(self):
# 初始化为空
self.db = None
def connect(self):
try:
# 选择 json 文件进行存储必需数据
with open('database_login.json', 'r') as f:
db_config = json.load(f)
self.host = db_config['host']
self.port = db_config['port']
self.username = db_config['username']
self.password = db_config['password']
self.database = db_config['database']
self.db = pymysql.connect(
host=self.host,
port=self.port,
user=self.username,
password=self.password,
database=self.database
)
except pymysql.Error as e:
print('数据库连接失败:', str(e))
这是student_operate文件
import pymysql
from db_conn import DatabaseConnection
class StudentOperations:
def __init__(self):
self.db_conn = DatabaseConnection()
# 直接使用未成功初始化的 db ,会导致报错
self.cur = self.db_conn.db.cursor()
然后这个时候会显示没有db这个属性
二、该属性存在但是因为作用域问题,无法正确传递到类方法中
class OuterClass:
# 初始化x,令self.x为10
def __init__(self):
self.x = 10
def outer_method(self):
class InnerClass:
def inner_method(self):
# 这里尝试访问外部类的属性 x ,但由于作用域限制,会引发异常
try:
print(self.x + 5)
except Exception as e:
print('异常;'+str(e))
inner_instance = InnerClass()
inner_instance.inner_method()
outer_instance = OuterClass()
outer_instance.outer_method()
在上述代码中,InnerClass
的 inner_method
方法中尝试访问 OuterClass
的实例属性 x
,由于作用域的限制,会抛出 AttributeError
异常。
解决方法
针对未初始化和初始化为空进行修改
一、未初始化
# 定义一个类
class MyClass:
# 定义方法
def my_method(self):
try:
self.x # 未初始化就使用
print(self.x)
except Exception as e:
print('异常:'+str(e))
# 创建对象
my_instance = MyClass()
# 通过对象调用方法
my_instance.my_method()
# 上面是错误的代码
# 下面是修改后的代码
# 定义一个类
class MyClass:
# 构造函数,用于初始化属性
def __init__(self):
self.x = None # 初始化 x 为 None
# 定义方法
def my_method(self):
try:
if self.x is not None: # 增加判断,避免在 x 为 None 时使用
print(self.x)
else:
print("x 尚未被赋予具体值")
except Exception as e:
print('异常:' + str(e))
# 创建对象
my_instance = MyClass()
# 通过对象调用方法
my_instance.my_method()
二、初始化为空
import pymysql
from db_conn import DatabaseConnection
class StudentOperations:
def __init__(self):
self.db_conn = DatabaseConnection()
# 直接使用未成功初始化的 db ,会导致报错
self.cur = self.db_conn.db.cursor()
# 上面是之前的代码
# 下面是修改后的代码
import pymysql
from db_conn import DatabaseConnection
class StudentOperations:
def __init__(self):
self.db_conn = DatabaseConnection()
# 只有在数据库连接成功后获取游标
if self.db_conn.db:
self.cur = self.db_conn.db.cursor()
三、作用域访问问题
作用域的访问问题,在这时如果去报错了,那就重新梳理逻辑,然后如果确实逻辑没有问题,那就重新换个思路吧。
针对这个问题,我的认识还是比较浅薄,如果有写的错误的欢迎您的指教。——感谢
原文地址:https://blog.csdn.net/2301_80304567/article/details/140788024
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!