137

私は「Dive Into Python」を読んでいて、クラスに関する章で次の例を示しています。

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

次に、作成者は、メソッドをオーバーライドする場合は、正しいパラメーターを使用し __init__て親を明示的に呼び出す必要があると述べています。__init__

  1. そのFileInfoクラスに複数の祖先クラスがある場合はどうなりますか?
    • 祖先クラスのすべての__init__メソッドを明示的に呼び出す必要がありますか?
  2. また、オーバーライドしたい他のメソッドに対してこれを行う必要がありますか?
4

5 に答える 5

172

この本は、サブクラスとスーパークラスの呼び出しに関して少し古くなっています。また、組み込みクラスのサブクラス化に関しても少し時代遅れです。

今日では次のように表示されます。

class FileInfo(dict):
    """store file metadata"""
    def __init__(self, filename=None):
        super(FileInfo, self).__init__()
        self["name"] = filename

次の点に注意してください。

  1. dictlisttupleなどの組み込みクラスを直接サブクラス化できます。

  2. このsuper関数は、このクラスのスーパークラスを追跡し、それらの関数を適切に呼び出します。

于 2009-04-15T20:49:52.597 に答える
21

継承する必要がある各クラスで、子クラスの開始時に初期化が必要な各クラスのループを実行できます...コピーできる例は、よりよく理解されるかもしれません...

class Female_Grandparent:
    def __init__(self):
        self.grandma_name = 'Grandma'

class Male_Grandparent:
    def __init__(self):
        self.grandpa_name = 'Grandpa'

class Parent(Female_Grandparent, Male_Grandparent):
    def __init__(self):
        Female_Grandparent.__init__(self)
        Male_Grandparent.__init__(self)

        self.parent_name = 'Parent Class'

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
#---------------------------------------------------------------------------------------#
        for cls in Parent.__bases__: # This block grabs the classes of the child
             cls.__init__(self)      # class (which is named 'Parent' in this case), 
                                     # and iterates through them, initiating each one.
                                     # The result is that each parent, of each child,
                                     # is automatically handled upon initiation of the 
                                     # dependent class. WOOT WOOT! :D
#---------------------------------------------------------------------------------------#



g = Female_Grandparent()
print g.grandma_name

p = Parent()
print p.grandma_name

child = Child()

print child.grandma_name
于 2012-06-15T17:43:42.557 に答える
16

基本クラスのメソッドを実際に呼び出す必要はありません、基本クラスは残りのクラスのメソッドが機能するために必要ないくつかの重要な初期化を行うため、通常は呼び出したいと考えています。__init__

他の方法については、あなたの意図に依存します。基本クラスの動作に何かを追加したいだけの場合は、基本クラスのメソッドを独自のコードに追加して呼び出す必要があります。動作を根本的に変更したい場合は、基本クラスのメソッドを呼び出して、すべての機能を派生クラスに直接実装することはできません。

于 2009-04-15T21:00:40.997 に答える
4

FileInfo クラスに複数の祖先クラスがある場合は、それらのすべての__init__()関数を確実に呼び出す必要があります。__del__()デストラクタである関数についても同じことを行う必要があります。

于 2009-04-15T20:49:08.247 に答える
2

__init__はい、親クラスごとに呼び出す必要があります。両方の親に存在する関数をオーバーライドする場合、同じことが関数にも当てはまります。

于 2009-04-15T20:50:35.420 に答える