如何使python类采用其他类?

时间:2019-10-21 15:27:27

标签: python python-3.x class inheritance

我正在用Python做虚拟助手。我有一个用于提示的类,一个用于处理请求的当前为空的类,并将有一个用于显示结果的类。

这是我的代码:

#Pysistant
#Google Assistant clone(ish) built with Python and Tkinter

import tkinter as tk

class Prompt:
    def __init__ (self, typ, message):
        self.window = tk.Tk()
        self.message = message
        self.typ = typ.lower()

        if typ == "one line":
            self.text = tk.Label(self.window, text=self.message)
            self.frame = tk.Frame(self.window)
            self.entry = tk.Entry(self.frame)
            self.button = tk.Button(self.frame, text="Done", command=lambda: self.command_wrapper(self.entry.get().lower()))
            self.text.pack()
            self.entry.pack()
            self.button.pack()
            self.frame.pack()


    def command_wrapper(self, query):
        if "math" or "calc" in query:
           func = "math"
           params = query[5:]
        self = Command(func, params)

    def quit(self):
       self.window.destroy()


class Command:
    def __init__(self, func, params):
        self.window = tk.Tk()
        self.func = func
        self.params = params
        self.text = tk.Label(self.window, text="Processing your request")
        self.text.pack()
        self.quit()

    ###TODO: Create subclasses for different functions


instance = Prompt('one line', "What would you like to accomplish today?")

我希望实例在调用Command之后引用一个command_wrapper()对象,但是它引用一个Prompt对象。调用instance.quit()只会破坏提示窗口。

2 个答案:

答案 0 :(得分:0)

不确定我是否正确理解了这个问题-这是您要寻找的吗?

    def command_wrapper(self, query):
        if "math" or "calc" in query:
            func = "math"
            params = query[5:]
        return Command(func, params)

答案 1 :(得分:0)

Prompt实例self的引用没有被这样的赋值self = Command(func, params)取代(在command_wrapper方法内),而只是该上下文中的局部变量。

您的短语“我希望实例引用一个Command对象” 表示使用 委派 的意图。 br /> 为委托定义一个附加字段,例如self._command = None(在Prompt构造函数内)。
修改command_wrapper以设置一个委托人self._command = Command(func, params)
更改quit方法以销毁内部 command 窗口:

def quit(self):
   self._command.window.destroy()

但是,要最终销毁最初的 prompt 实例窗口,您必须直接调用它:prompt_instance.window.destroy()