Inheritance and Overriding __init__ in python

前端 未结 5 1642
春和景丽
春和景丽 2020-12-04 06:44

I was reading \'Dive Into Python\' and in the chapter on classes it gives this example:

class FileInfo(UserDict):
    \"store file metadata\"
    def __init_         


        
相关标签:
5条回答
  • 2020-12-04 07:24

    You don't really have to call the __init__ methods of the base class(es), but you usually want to do it because the base classes will do some important initializations there that are needed for rest of the classes methods to work.

    For other methods it depends on your intentions. If you just want to add something to the base classes behavior you will want to call the base classes method additionally to your own code. If you want to fundamentally change the behavior, you might not call the base class' method and implement all the functionality directly in the derived class.

    0 讨论(0)
  • 2020-12-04 07:30

    The book is a bit dated with respect to subclass-superclass calling. It's also a little dated with respect to subclassing built-in classes.

    It looks like this nowadays:

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

    Note the following:

    1. We can directly subclass built-in classes, like dict, list, tuple, etc.

    2. The super function handles tracking down this class's superclasses and calling functions in them appropriately.

    0 讨论(0)
  • 2020-12-04 07:30

    Yes, you must call __init__ for each parent class. The same goes for functions, if you are overriding a function that exists in both parents.

    0 讨论(0)
  • 2020-12-04 07:32

    In each class that you need to inherit from, you can run a loop of each class that needs init'd upon initiation of the child class...an example that can copied might be better understood...

    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
    
    0 讨论(0)
  • 2020-12-04 07:48

    If the FileInfo class has more than one ancestor class then you should definitely call all of their __init__() functions. You should also do the same for the __del__() function, which is a destructor.

    0 讨论(0)
提交回复
热议问题