【问题标题】:Can not call a function to a class from other classes不能从其他类调用一个类的函数
【发布时间】:2017-06-02 11:19:59
【问题描述】:

我是 Python 类的新手,正在尝试通过 Tkinter 为科学代码编写接口。但是我不能从一个类或函数中调用一个函数(它在另一个类中并打开一个不同的框架)。我一直在寻找超过 2 天,但找不到我的案例的答案。如果您像解释孩子一样解释,我会很高兴,因为我不了解太多技术细节。

我的代码结构是这样的:

class first_class(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
                 ....
        def WhateverFunction():
           "do sth"
class second_class(tk.Tk):

   def __init__(self, parent, controller):
       tk.Frame.__init__(self, parent)
               .....
       **I want to use "WhateverFunction" here** 
               .....

所以基本上,我无法从另一个类访问该函数。

我在网上找到的搜索类似Python using methods from other classes 方法。 Bu 这并没有解决我的问题。这可能是因为我正在使用不同的 Tkinter 框架。我现在没有...谢谢,干杯!

【问题讨论】:

  • 如果您想使用该功能,您需要从您创建的第一个类继承。 class second_class(first_class): 或从first_class().WhateverFunction() 中调用类方法
  • WhateverFunction 是否需要成为first_class 的方法?注意:您的 sn-p 缩进方式,WhateverFunction 实际上是在 first_class.__init__ 中定义的,因此只能在 first_class.__init__ 中访问
  • @brunodesthuilliers 啊...已将其归结为复制/粘贴或缩进错误。但是,是的,这会在某种程度上改变任何可能的答案
  • 您不能拥有两个 tk.Tk 实例(或两个继承自 tk.Tk 的事物的实例)。为什么必须有两个类,每个类都继承自 tk.Tk
  • @BryanOakley 这是评论的第二部分,但是“你需要...”是不正确的。

标签: python class tkinter self


【解决方案1】:

在您的代码中,您将函数 WhateverFunction 定义为 __init__ 中的本地函数。所以从你代码的其他部分看不到,也无法调用。

例如,您可以将函数实现为方法。它看起来像这样:

class first_class(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
             ....
    def WhateverFunction(self):
       "do sth"

现在该函数可以作为first_class 实例的方法在任何地方调用:

first_class_instance = first_class()
first_class_instance.WhateverFunction()

【讨论】:

  • 好吧,不——撇开缺少self 不谈,它仍然可以通过first_class.WhateverFunction() 调用......它不是不可能被调用的。
  • @JonClements 查看 OP 的代码。 WhateverFunction__init__内是本地的,所以不能调用,因为它在外面不存在。
  • 是的...刚刚注意到...请参阅我对布鲁诺的 Q 的评论。如果这是故意的,那么你是对的。
【解决方案2】:

不久前我在这里问了完全相同的问题,但没有任何回应。基本上,你做不到。 WhateverFunction 只存在于__init__ 的范围内,而second_class 本身只能调用。这是通过您链接到的“使用其他类的方法”问题中描述的方法完成的,但它对于做您想做的事情没有用,因为您可能只能从__init__ 获得 output ,因此您无法访问该函数中定义的任何函数。

要解决这个问题,为什么不全局定义WhateverFunction,然后像往常一样调用它,或者在__init__ 函数之外但仍在first_class 内声明它?

【讨论】:

    【解决方案3】:

    只需创建该类的一个实例,如果 second_class 实例应该由第一个实例组成,则调用该方法。

    def second_class(tk.Tk):
    
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
    
            first_object = first_class().WhateverFunction()
    

    现在更好的方法是从第一个继承 second_class,并在考虑两个类具有相同父级的情况下调用该方法,前提是继承有意义。

    def second_class(first_class):
    
        def __init__(self, parent, controller):
            super(second_class, self).__init__(parent, controller)
    
            self.WhateverFunction()
    

    注意:- 请尽量遵循 Python 的某些约定,例如用驼峰命名的类,以及用蛇命名的方法/函数。

    【讨论】:

    • 继承很可能不是“更好的方法”...组合/委托通常是更好的选择,实际上在 GUI 类之外定义的普通函数或实用程序类也是共享代码的好方法引入过度依赖。
    • 如果他使用上面的类作为一个 mixin。我同意组合通常比继承更好,但有些地方继承更有意义。
    • “确实有一些地方”——我的意思是,有几个地方继承是正确的解决方案。只有少数......现在我们真的没有足够的上下文来真正说出什么是“最佳”解决方案,因为我们不知道WhateverFunction() 做了什么,也不知道它是否真的属于first_class 开始与;)
    • 我同意我们没有足够的知识来得出任何充分的结论,但考虑到这两个类都继承自 tk.Tk,因此有根据的猜测认为继承会是更好的方法。跨度>
    • 两个类 A 和 B 具有相同的父类 P 的事实并不意味着 A 在任何方面都是 B,尤其是在涉及 GUI 或 ORM 类时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多