Python 默认参数和可选参数之间的差异
好的,代码:Python 默认参数和可选参数之间的差异,python,wxpython,optional-parameters,keyword-argument,Python,Wxpython,Optional Parameters,Keyword Argument,好的,代码: #!/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 Te
#!/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)
与:
现在,它没有运行
我希望能够在传递不同参数的代码中多次调用MyFrame构造函数
我尝试了很多东西
用所有参数实例化MyFrame
实例化myFrame并使用all,但默认参数具有所有参数的构造函数方法签名
构造函数方法签名包含所有参数,但不包含默认参数
使用所有参数调用父构造函数方法
使用所有参数(默认参数除外)调用父构造函数方法 另外,本教程还提到了一种默认参数和可选参数数量不同的方法!(有什么区别?) 乌德帕特: “它有七个参数。第一个参数没有默认值。其他六个参数有。这四个参数是可选的。前三个是必需的。”- 更新2: 使用分号更正,我刚刚尝试:
class MyFrame(wx.Frame):
def __init__(self, parent, id, title, size, style):
wx.Frame.__init__(self, parent, id, title, size, style)
- 我告诉你什么是论点(第二行)
- 我用输入的参数调用(第三行)
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.
回溯(最近一次呼叫最后一次):
文件“test.py”,第29行,在
app=XPinst()
文件“test.py”,第8行,在_init中__
wx.App.\uuuuu初始化(self,重定向,文件名)
文件“/usr/lib/python2.6/dist packages/wx-2.8-gtk2-unicode/wx/_core.py”,第7978行,在u init中__
self._BootstrapApp()
文件“/usr/lib/python2.6/dist packages/wx-2.8-gtk2-unicode/wx/_core.py”,第7552行,在_BootstrapApp中
返回_core_uu.PyApp_uuubootstrapapp(*args,**kwargs)
文件“test.py”,第10行,在OnInit中
frame=MyFrame(无,-1,title='Redirect Test',size=(620450),style=wx.STAY_ON_TOP | wx.DEFAULT_frame_style)
文件“test.py”,第21行,在_init中__
wx.Frame.\uuuuu init\uuuuuuuuuuuuuuux(自我、父项、id、标题、大小、样式)
文件“/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode/wx/_-windows.py”,第497行,在u init中__
_视窗框架开关(自,视窗新框架(*args,**kwargs))
TypeError:应为2元组整数或wxSize对象。
为什么它不起作用呢?对我来说只要一个调整就可以了;子类
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>
关于关键字参数: 当您将参数作为关键字(例如标题、大小、样式)传递时,它们在实际使用它们的函数中的位置可能会完全不同。这里的第一行为
wx.Frame.\uuuu init\uuuu
函数中的第五个参数赋值“size”,这可能不是size。这可能是第100个参数,但您可以使用关键字来告诉它去哪里
“可选”有点模糊;关键字参数提供默认值,但默认值可能不合适。您缺少
框架中的位置。\uuuuu init\uuuu
调用。以下是来自以下方面的原型:
因此,基本上错误是,它期望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)
当你说“它不跑”时,它会做什么?错误?向我们显示详细信息。屏幕上没有显示窗口,而是没有显示任何内容。您是否正在命名文件*.pyw
?当我这样做的时候,我还“什么也得不到”类语法错误(见我的答案)。将它们命名为*.py
和/或从控制台运行它们进行开发,那么它实际上会向您显示错误。Nick,我得到了一个“TypeError:应该是一个2元组的整数或wxSize对象”。我没有谈到这一点吗P他没有删除大小,更重要的是他删除了关键字参数,并用位置参数替换了它们,这有效地做到了wx.Frame.\uu init\uuuu(self,parent,id=id,title=title,pos=size,size=style)
啊,对了-应该读了你的整个答案-我觉得问题还没有解决。是,然后不是,然后是,然后不是……这更像是一场讨论,而不是问答:P
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)