28

次のクラスが設定されているとします。

class Foo:
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz
class Bar:
     def __init__(self, frob, frizzle):
          self.frobnicate = frob
          self.frotz = 34
          self.frazzle = frizzle

このコンテキストで super() を使用して重複コードを排除するにはどうすればよいでしょうか?

4

2 に答える 2

29

クラスBarでコンストラクター内に値34を設定する場合、これは機能します。

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          super(Bar, self).__init__(frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle

ただし、super独自の問題が発生します。たとえば、非常に有害であると見なされるを参照してください。完全を期すために、これは。なしの同等のバージョンsuperです。

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          Foo.__init__(self, frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle
于 2009-07-23T19:57:25.963 に答える
26

Python> = 3.0では、次のようになります。

class Foo():
    def __init__(self, frob, frotz)
        self.frobnicate = frob
        self.frotz = frotz

class Bar(Foo):
    def __init__(self, frob, frizzle)
        super().__init__(frob, 34)
        self.frazzle = frizzle

詳細はこちら:http ://docs.python.org/3.1/library/functions.html#super

編集:別の回答で述べたように、単に使用Foo.__init__(self, frob, 34)する方が良い解決策になる場合があります。(たとえば、特定の形式の多重継承を操作する場合。)

于 2009-07-23T19:58:31.797 に答える