如何使用在Python中传递参数的方法从另一个类执行类方法

时间:2017-10-29 21:01:01

标签: python oop methods callback

我是学习python的初学者。 我正在寻求解决OOP问题的帮助

我的主程序有如下简化的内容:

class abc(Frame):
     def _init_(self,  master)
           Frame.__init__(self)     
           self.B1 = Mybutton(self.master, self.cmd)
     def cmd(self):
           print("hello world")

在主程序中,我在另一个文件中导入Mybutton类,简化如下:

class Mybutton():
     def _init_(self, parent, command):
           self.command = command

     def A_ramdom_fcn(self): 
           ...
           self.command()  ------------------>> here I want to execute the command
                                                                       in class abc, not in class Mybutton.

如何从作为实例方法传递的另一个类执行一个方法,你可能会问为什么不在abc类中执行它,但是我将事件附加到按钮按下,它需要做一个环形交叉口来实现这一点。 。

2 个答案:

答案 0 :(得分:0)

首先,修复拼写错误:在:的init方法中缺少abc,对于这两个类,它应该是__init__(带有两个下划线)。

好像你已经转过身来。您已使用合成正确设置:abc有一个Mybutton,看起来您正确地将该函数传递给Mybutton,以便它可以执行它。实际上,如果你这样做,你的代码将按照书面形式工作,例如

a = abc(master)  # no context for what master is, but I assume you have it
a.B1.A_ramdom_fcn()

按照您设置的方式,您不想在主程序中导入和制作Mybutton的实例(它们属于哪个abc?) 。您想导入并创建abc的实例。然后,您可以像上面示例中显示的那样访问其内部Mybutton。这是有效的,因为当您在self.cmd构造函数内部将Mybutton传递给abc构造函数时,它已经是您abc的绑定方法了构建。

作为附录,看起来你可能有XY problem关于为什么需要这种迂回方法。您有什么理由不能将abc.cmd简单地传递给按钮按下处理程序吗?

答案 1 :(得分:0)

从理论上讲,你正在尝试的是,你可以将对象方法捕获到变量中并稍后调用它(python 3):

class Window:

    def __init__(self):
        self.my_button = Mybutton(self.cmd)

    def cmd(self):
        print("hello world")


class Mybutton:

    def __init__(self, command):
        self.command = command

    def a_ramdom_fcn(self):
        self.command.__call__()


win = Window()
win.my_button.a_ramdom_fcn()

我假设您正在尝试创建通用Button类,该类在单击时不知道该怎么做,并且您希望将实际逻辑放入Window类。

这是有道理的,但将逻辑提取到第三个Command类中会更好。这允许我们限制Window责任并且还避免使用method-as-variable(我们传递给按钮对象的command只是另一个对象):

class HelloWorldCommand:

    def execute(self):
        print("Hello world")


class Window:

    def __init__(self):
        self.my_button = Mybutton(
            HelloWorldCommand()
        )

class Mybutton:

    def __init__(self, command):
        self.command = command

    def a_ramdom_fcn(self):
        self.command.execute()


win = Window()
win.my_button.a_ramdom_fcn()