我是学习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类中执行它,但是我将事件附加到按钮按下,它需要做一个环形交叉口来实现这一点。 。
答案 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()