Python使用super()进行继承

时间:2020-01-29 18:50:40

标签: python-3.x oop inheritance tkinter super

假设我有2个文件,用于显示GUI的frontend.py和用于数据库功能的backend.py。我在使用super()继承数据库类时遇到问题。来自#frontend.py

的managerPage类中的#backend2.py

我有错误:

frame = F(容器,自身) TypeError: init ()缺少2个必需的位置参数:“ cn”和“ cur”

我相信这与tk.Frame类中的 init 有关,我也已经在managerPage类中继承了该类。我相信selfService类(已为我自己重新命名)归功于用户@BryanOakley。有人可以帮助我成功利用super()。

frontend.py。

import backend2

class selfService(tk.Tk, Toplevel):

    def __init__(self, *args, **kwargs):
        #Toplevel.__init__(self)
        self.employeeWindow = None


        tk.Tk.__init__(self, *args, **kwargs)
        self.container = tk.Frame(self)

        self.container.pack(side="top", fill="both", 
        expand = True)

        self.container.grid_rowconfigure(0, 
        weight=1)
        self.container.grid_columnconfigure(0, 
        weight=1)

        self.frames = {}


        selfService.restart = False

        for F in (StartPage, PageOne, PageTwo):

        self.frame = F(self.container, self)

        self.frames[F] = self.frame

        self.frame.grid(row=0, column=0, 
        sticky="nsew")

        self.show_frame(StartPage)


    def show_frame(self, cont):
        self.frame = self.frames[cont]
        self.frame.tkraise()

class managerPage(tk.Frame, 
    validation.account_validation,backend2.Database):
    def __init__(self, parent, controller, cn, cur):
        tk.Frame.__init__(self,parent)
        super().__init__(cn, cur)

        print(self.cn)

backend2.py

class Database():
    def __init__(self):
        self.config = {
        'user': 'root',
        'password': 'root',
        'host': 'localhost',
        'database': 'myDatabase'}

        self.cn = 
        mysql.connector.connect(**self.config)
        self.cur = self.cn.cursor()

1 个答案:

答案 0 :(得分:0)

继承不是用于在两个不同对象之间共享数据。您的managerPage不应继承数据库类。该页面不能同时是一个页面和一个数据库。如果您使用继承,则每个实例将是数据库的一个单独实例。

相反,您应该创建Database类的单个实例,并将该实例传递给需要它的页面。那样,或者在控制器上添加一个可以返回实例的方法。

例如,您可以在控制器的__init__中创建数据库实例:

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。一个或另一个,但不能同时继承)。