5.12. OOP Inheritance Super¶
5.12.1. Inheritance Static Fields¶
On static fields:
>>> class Person:
... firstname = 'Mark'
... lastname = 'Watney'
... job = 'unemployed'
>>>
>>>
>>> class Astronaut(Person):
... job = 'astronaut'
>>>
>>>
>>> astro = Astronaut()
>>>
>>> astro.firstname
'Mark'
>>> astro.lastname
'Watney'
>>> astro.job
'astronaut'
5.12.2. Inheritance Dynamic Fields¶
>>> class Person:
... def __init__(self):
... self.firstname = 'Mark'
... self.lastname = 'Watney'
... self.job = 'unemployed'
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... self.job = 'astronaut'
>>>
>>>
>>> astro = Astronaut()
>>> print(vars(astro))
{'job': 'astronaut'}
5.12.3. Super¶
Order is important
Raymond Hettinger - Super considered super! - PyCon 2015 1
>>> class Person:
... def __init__(self):
... self.firstname = 'Mark'
... self.lastname = 'Watney'
... self.job = 'unemployed'
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... super().__init__()
... self.job = 'astronaut'
>>>
>>>
>>> astro = Astronaut()
>>> print(vars(astro))
{'firstname': 'Mark', 'lastname': 'Watney', 'job': 'astronaut'}
>>> class Person:
... def __init__(self):
... self.firstname = 'Mark'
... self.lastname = 'Watney'
... self.job = 'unemployed'
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... self.job = 'astronaut'
... super().__init__()
>>>
>>>
>>> astro = Astronaut()
>>> print(vars(astro))
{'job': 'unemployed', 'firstname': 'Mark', 'lastname': 'Watney'}
5.12.4. Super Init¶
>>> class Person:
... def __init__(self):
... print('Person init')
>>>
>>>
>>> class Astronaut(Person):
... pass
>>>
>>>
>>> astro = Astronaut()
Person init
>>> class Person:
... def __init__(self):
... print('Person init')
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... print('Astronaut init')
>>>
>>>
>>> astro = Astronaut()
Astronaut init
>>> class Person:
... def __init__(self):
... print('Person init')
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... super().__init__()
... print('Astronaut init')
>>>
>>>
>>> astro = Astronaut()
Person init
Astronaut init
>>> class Person:
... def __init__(self):
... print('Person init')
>>>
>>>
>>> class Astronaut(Person):
... def __init__(self):
... print('Astronaut init')
... super().__init__()
>>>
>>>
>>> a = Astronaut()
Astronaut init
Person init