Python类间变量传递问题:如何从Login类获取high_score到Game类
Python类间变量传递问题解决(Login到Game类传递high_score)
问题场景
学习Python类的使用时,尝试将Login类enter方法中获取的high_score变量传递到Game类中,运行代码时触发错误:AttributeError: type object 'Login' has no attribute 'self'。
错误原因
Login.self.high_score是错误写法:self是类实例的专属引用,仅能通过类的实例对象访问,不能直接通过类名(Login)调用。- Game类初始化时未获取到Login的实例对象,无法直接访问其属性。
解决方案
方法1:直接传递high_score数值
这是最直接的方式,在创建Game实例时将high_score作为参数传入。
修改Login类的open_game方法
假设Login类中有open_game方法用于启动Game窗口,修改为:
def open_game(self): # 传入当前实例的high_score给Game Game(self.high_score)
修改Game类的初始化方法
from login import Login import tkinter as tk from tkinter import messagebox class Game: # 接收传入的high_score参数 def __init__(self, high_score): self.root = tk.Toplevel() self.root.geometry('1080x720') self.High_score_label = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text='High Score') self.High_score_label.place(x=440, y=150, width=200, height=50) # 使用传入的high_score值,转为字符串避免类型问题 self.High_score_num = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text=str(high_score))
方法2:传递Login实例(适用于需要多个Login属性的场景)
如果后续需要访问Login实例的其他属性,可以直接将Login实例传递给Game。
修改Login类的open_game方法
def open_game(self): # 传入当前Login实例 Game(self)
修改Game类的初始化方法
from login import Login import tkinter as tk from tkinter import messagebox class Game: # 接收Login实例参数 def __init__(self, login_instance): self.root = tk.Toplevel() self.root.geometry('1080x720') # 保存Login实例引用,方便后续访问其他属性 self.login = login_instance self.High_score_label = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text='High Score') self.High_score_label.place(x=440, y=150, width=200, height=50) # 通过Login实例访问high_score属性 self.High_score_num = tk.Label(self.root, width=20, font=('Times New Roman', 20, 'bold'), text=str(self.login.high_score))
额外优化建议
将Login类enter方法内的导入语句移到文件顶部,避免每次调用方法时重复导入:
# 移到Login类所在文件的顶部 import sqlite3 from user_data import Database from tkinter import messagebox class Login: # ... 其他代码 ... def enter(self): db = Database() self.username = self.username_entry.get() self.password = self.password_entry.get() sql = f'SELECT UserPassword, High_Score FROM user WHERE UserName = "{self.username}"' db.c.execute(sql) result = db.c.fetchall() print(result) real_password = result[0][0] self.high_score = result[0][1] print(real_password) if self.password == real_password: messagebox.showinfo('Login Status',f'Account found High score = {self.high_score}') self.open_game() return self.high_score
内容的提问来源于stack exchange,提问作者HurricaneShard
相关产品推荐
相关产品推荐

