Разница между дефолтом и необязательными аргументами
-
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
Быть объектом с двумя тупе или 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)