默认参数和可选参数之间的区别
-
30-09-2019 - |
题
好的代码:
#!/usr/bin/python
import wx
import sys
class XPinst(wx.App):
def __init__(self, redirect=False, filename=None):
wx.App.__init__(self, redirect, filename)
def OnInit(self):
frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
panel = wx.Panel(frame, -1)
log = wx.TextCtrl(panel, -1, size=(500,400), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
redir=RedirectText(log)
sys.stdout=redir
print 'test'
frame.Show()
return True
class RedirectText:
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
app = XPinst()
app.MainLoop()
添加:
class MyFrame(wx.Frame)
def __init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE):
wx.Frame.__init__(self, parent, id, title, size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
更换:
frame = wx.Frame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
和:
frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
现在,它不运行...
我希望能够在我的代码中多次调用MyFrame构造函数。
我尝试了很多事情...
使用所有参数来实现myframe,以实现myframe等,但默认参数
所有参数的构造方法签名
构建器方法签名与所有签名,但默认参数
使用所有参数调用父构建器方法
与所有人调用父构建器方法,但默认参数
加上教程 http://zetcode.com/wxpython/ 提到一种方法,其中默认参数和可选参数的数量不同! (有什么不同?)
udpate:
“它有七个参数。第一个参数没有默认值。其他六个参数确实具有。这四个参数是可选的。前三个是强制性的。” - http://zetcode.com/wxpython/firststeps/
更新2:
有了半彩色的校正,我刚刚尝试了:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
- 我说(第二行)正在发生什么论点
- 我打电话给参数(第三行)
更新3:
完整的错误消息是:
Traceback (most recent call last):
File "test.py", line 29, in <module>
app = XPinst()
File "test.py", line 8, in __init__
wx.App.__init__(self, redirect, filename)
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7978, in __init__
self._BootstrapApp()
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py", line 7552, in _BootstrapApp
return _core_.PyApp__BootstrapApp(*args, **kwargs)
File "test.py", line 10, in OnInit
frame = MyFrame(None, -1, title='Redirect Test', size=(620,450), style=wx.STAY_ON_TOP|wx.DEFAULT_FRAME_STYLE)
File "test.py", line 21, in __init__
wx.Frame.__init__(self, parent, id, title, size, style)
File "/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_windows.py", line 497, in __init__
_windows_.Frame_swiginit(self,_windows_.new_Frame(*args, **kwargs))
TypeError: Expected a 2-tuple of integers or a wxSize object.
为什么不起作用?
解决方案
一项调整对我来说很好。您的子分类后您错过了结肠 wx.Frame
陈述。
一条评论;如果您只是“通过”向父母的恐怖分子“通过”论点,请使用 *args
和/或 **kwargs
保存一些打字。
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
如果要修改或添加特定参数,则可以修改字典 kwargs
, ,例如
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
kwargs['size']=(1000,200)
wx.Frame.__init__(self, *args, **kwargs)
在运行文件以进行开发:
运行您在控制台上工作的脚本, python
, , 不是 pythonw
. 。后者看到错误并将其送往拉拉 - 陆地时会退出。
N:\Code>pythonw wxso.pyw
N:\Code>rem nothing happened.
N:\Code>python wxso.pyw
File "wxso.pyw", line 24
class MyFrame(wx.Frame)
^
SyntaxError: invalid syntax
N:\Code>
关于关键字参数:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
#wx.Frame.__init__(self, parent, id, title, size, style) # broken
# equivalent to:
#wx.Frame.__init__(self, parent, id=id, title=title, pos=size, size=style)
# the below works.
wx.Frame.__init__(self, parent, id, title=title, size=size, style=style)
当您将参数作为关键字(例如标题,大小,样式,其位置,实际上采用它们的函数)时可能完全不同。那里的第一行将“大小”分配给任何是第五个参数 wx.Frame.__init__
功能,可能不是大小。这可能是第100个参数,但是您使用关键字来告诉它去哪里。
“可选”有些模糊。 关键字参数 供应默认值,但默认值可能不合适。
其他提示
你错过了 pos
从你的 Frame.__init__
称呼。这是来自 文档:
Frame.__init__(self, parent, id, title, pos, size, style, name)
因此,基本上错误是说它期望 size
要成为2元组或wxsize对象,而您所传递的内容则与之匹配。我猜这是您删除时的爬行 size=
来自这里的构造函数:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
编辑:以下任何一个都可以
wx.Frame.__init__(self, parent, id, title, size=size, style=style)
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size, style)
但是,通过省略参数中的关键字,您的呼叫正在通过命令中处理,
wx.Frame.__init__(self, parent, id, title, pos=size, size=style)