2012-04-15 3 views
3

web.form.Formをwebpyフレームワークからサブクラス化して動作を変更しようとしています(テーブルからレンダリング)。今、私はこのエラーobject.__init__() takes no parameters取得していサブクラス化しようとしていますが、オブジェクトを取得しようとしています.____ init __()はパラメータを受け取りません。

class SyssecForm(web.form.Form): 

      def __init__(self, *inputs, **kw): 
       super(SyssecForm, self).__init__(*inputs, **kw) 

      def render(self): 
       out='<div id="form"> ' 
       for i in self.inputs: 
        html = utils.safeunicode(i.pre) + i.render() + self.rendernote(i.note) + utils.safeunicode(i.post) 
        out += "%s"%(html) 
        out += '"<div id="%s"> %s %s</div>'% (i.id, net.websafe(i.description), html) 
       out+= "</div>" 
       return out 

error traceback

+0

'super()'で使用するようにメソッドが特別に設計されていない状況で 'super()'を使用することをお勧めします。特に '__init __()'は 'super()'とうまく動作するように設計されていないので、明示的な基本クラス呼び出し 'web.form.Form .__ init __(self、...)'を使うべきです。 –

+1

@Svenそれは "新しいスタイル"か "古いスタイル"クラスかによって異なります。新しいスタイルクラス( "object"を継承したクラス)では常に 'super'を使うべきですが、古いスタイルクラスでは決して使用しないでください。 – Keith

+0

それはPython 2.7だから、私は推測する古いスタイルだと思います。 –

答えて

1

これは(0.37 web.py)私の作品:web.form.Formは今objectから継承するので、あなたは、時代遅れweb.pyを持っている可能性があるため、

import web 

class SyssecForm(web.form.Form): 

    def __init__(self, *inputs, **kw): 
     super(SyssecForm, self).__init__(*inputs, **kw) 

    def render(self): 
     out='<div id="form"> ' 
     for i in self.inputs: 
      html = web.utils.safeunicode(i.pre) + i.render() + self.rendernote(i.note) + web.utils.safeunicode(i.post) 
      out += "%s"%(html) 
      out += '"<div id="%s"> %s %s</div>'% (i.id, web.net.websafe(i.description), html) 
     out+= "</div>" 
     return out 

form = SyssecForm(web.form.Textbox("test")) 
print form.render() 

あなたの問題がある:https://github.com/webpy/webpy/commit/766709cbcae1369126a52aee4bc3bf145b5d77a8

Superは新しいスタイルのクラスでのみ動作します。 objectを次のようにクラスの除名に追加する必要があります。class SyssecForm(web.form.Form, object):またはweb.pyを更新する必要があります。

+0

はい、サブベッドクラスをスーパークラスと同じように呼び出すのと違いは何ですか?私は同じ方法を「いいえ」と呼ぶべきでしょうか? –

+0

私の答えをチェックして、私はそれが正しいと思う。 –

2

をメッセージは、あなたが知る必要があるすべてを告げる私はこの方法でそれをやってみました。スーパークラスはオブジェクトであり、そのコンストラクタはパラメータをとりません。だから、あなたのコンストラクタのパラメータを渡さないでください。なぜなら、それらのパラメータをどうしたらいいのか分からないからです。

はこのようにそれを呼び出します。

super(SyssecForm, self).__init__() 
+2

うーん、スーパークラスのように見えるのは実際には 'web.form.Form'です。 –

+0

@svenエラーメッセージはかなり明確です。 –

+0

残念ながら。私はあなたが間違っていると言っているわけではない、私はちょうど私がまだ起こっていることを理解していないと言っています。 –

3

あなたが本当にそこに何もしていないされているのでとにかく、完全にあなたの__init__方法を削除します。

+0

'__init __()'メソッドが無意味であることは間違いありませんが、それをどうやって削除すればよいでしょうか?コードは、このメソッドなしで全く同じことを行う必要があります。つまり、エラーが発生します。 –

+0

ああ、どんな引数でもインスタンス化しないでください。または、すべてのスーパーメソッドをすべてではありません。その意図がここにあるのかどうかは分かりません。 – Keith

+0

これは本当ですが、initメソッドは最後に何もしません。なぜそれがエラーなのか分かりません。 Formクラスには、同じ引数を持つ同じinitメソッドがあります。 –

関連する問題