Python 3.x Python使用super()进行继承
假设我有两个文件,frontend.py用于显示GUI,backend.py用于数据库功能。我在使用super()继承数据库类时遇到问题。来自#frontend.py中managerPage类中的#backend2.py 我有一个错误: 框架=F(容器,自身) TypeError:init()缺少2个必需的位置参数:“cn”和“cur” 我相信这与tk.Frame类中的init有关,我也在managerPage类中继承了该类。我相信自助服务类(我为了自己的缘故而重新命名)是由user@BryanOakley创建的。有人能帮我成功地使用super()吗 frontend.py。 后端2.pyPython 3.x Python使用super()进行继承,python-3.x,oop,inheritance,tkinter,super,Python 3.x,Oop,Inheritance,Tkinter,Super,假设我有两个文件,frontend.py用于显示GUI,backend.py用于数据库功能。我在使用super()继承数据库类时遇到问题。来自#frontend.py中managerPage类中的#backend2.py 我有一个错误: 框架=F(容器,自身) TypeError:init()缺少2个必需的位置参数:“cn”和“cur” 我相信这与tk.Frame类中的init有关,我也在managerPage类中继承了该类。我相信自助服务类(我为了自己的缘故而重新命名)是由user@Bryan
继承不适用于在两个不同对象之间共享数据。您的
managerPage
不应继承您的数据库类。页面不能同时是页面和数据库。如果使用继承,则每个实例都将是数据库的单独实例
相反,您应该创建数据库
类的单个实例,并将该实例传递给需要它的页面。或者在控制器上添加一个可以返回实例的方法
例如,您可以在控制器的\uuuu init\uuu
中创建数据库实例:
class selfService(tk.Tk):
def __init__(self, *args, **kwargs):
...
self.db = Database()
...
然后,在任何引用控制器的代码中,您都可以使用self.controller.db
访问数据库,如以下示例所示:
class managerPage(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
...
print(self.controller.db)
(作为旁注,您不应该从
Tk
和Toplevel
继承一个或另一个,但不能两者兼而有之)。您使用继承的方式表明您不应该使用继承。您确定希望每个页面都有自己单独的数据库连接吗?Ie:如果你有3个页面,你将有3个不同的数据库连接。那是一个不同寻常的设计。谢谢但是在selfService中实例化db类时,我会遇到错误:return getattr(self.tk,attr)AttributeError:“\u tkinter.tkapp”对象没有属性“db”@grimReaperZ:正如我的第一个示例所示,您必须定义self.db
。
class selfService(tk.Tk):
def __init__(self, *args, **kwargs):
...
self.db = Database()
...
class managerPage(tk.Frame):
def __init__(self, parent, controller):
self.controller = controller
...
print(self.controller.db)