#!/usr/bin/env python3 # Copyright 2014 Brett Slatkin, Pearson Education Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Preamble to mimick book environment import logging from pprint import pprint from sys import stdout as STDOUT # Example 1 class MyBaseClass(object): def __init__(self, value): self.value = value class MyChildClass(MyBaseClass): def __init__(self): MyBaseClass.__init__(self, 5) def times_two(self): return self.value * 2 foo = MyChildClass() print(foo.times_two()) # Example 2 class TimesTwo(object): def __init__(self): self.value *= 2 class PlusFive(object): def __init__(self): self.value += 5 # Example 3 class OneWay(MyBaseClass, TimesTwo, PlusFive): def __init__(self, value): MyBaseClass.__init__(self, value) TimesTwo.__init__(self) PlusFive.__init__(self) # Example 4 foo = OneWay(5) print('First ordering is (5 * 2) + 5 =', foo.value) # Example 5 class AnotherWay(MyBaseClass, PlusFive, TimesTwo): def __init__(self, value): MyBaseClass.__init__(self, value) TimesTwo.__init__(self) PlusFive.__init__(self) # Example 6 bar = AnotherWay(5) print('Second ordering still is', bar.value) # Example 7 class TimesFive(MyBaseClass): def __init__(self, value): MyBaseClass.__init__(self, value) self.value *= 5 class PlusTwo(MyBaseClass): def __init__(self, value): MyBaseClass.__init__(self, value) self.value += 2 # Example 8 class ThisWay(TimesFive, PlusTwo): def __init__(self, value): TimesFive.__init__(self, value) PlusTwo.__init__(self, value) foo = ThisWay(5) print('Should be (5 * 5) + 2 = 27 but is', foo.value) # Example 11 # This is pretending to be Python 2 but it's not class MyBaseClass(object): def __init__(self, value): self.value = value class TimesFiveCorrect(MyBaseClass): def __init__(self, value): super(TimesFiveCorrect, self).__init__(value) self.value *= 5 class PlusTwoCorrect(MyBaseClass): def __init__(self, value): super(PlusTwoCorrect, self).__init__(value) self.value += 2 class GoodWay(TimesFiveCorrect, PlusTwoCorrect): def __init__(self, value): super(GoodWay, self).__init__(value) before_pprint = pprint pprint(GoodWay.mro()) from pprint import pprint pprint(GoodWay.mro()) pprint = pprint # Example 12 class Explicit(MyBaseClass): def __init__(self, value): super(__class__, self).__init__(value * 2) class Implicit(MyBaseClass): def __init__(self, value): super().__init__(value * 2) assert Explicit(10).value == Implicit(10).value