super
issubclass
mro
method:
method
resolution order
To find the temperature in fahrenheit, count how many times cricket chirps in 15 seconds and add 39.
import sys
class Cricket(object):
def __init__(self, chirps):
if not isinstance(chirps, int):
raise TypeError(f"chirps must be int, not {type(chirps)}")
if chirps < 0:
raise ValueError(f"chirps must be non-negative, not {chirps}")
self.chirps = chirps
def fahrenheit(self):
return self.chirps + 39
def __str__(self):
return f"cricket({self.chirps})"
class MetricCricket(Cricket):
def __init__(self, chirps):
super().__init__(chirps) #or Cricket.__init__(self, chirps)
def celsius(self):
return (self.fahrenheit() - 32) * 5 / 9 #or return (Cricket.fahrenheit(self) - 32) * 5 / 9
#or return (super().fahrenheit() - 32) * 5 / 9
def __str__(self):
return f"MetricCricket({self.chirps})"
class KelvinCricket(MetricCricket):
def __init__(self, chirps):
super().__init__(chirps)
def kelvin(self):
return self.celsius() + 273.15
def __str__(self):
return f"KelvinKricket({self.chirps})"
buddy = Cricket(33)
print(f"fahrenheit = {buddy.fahrenheit()}")
print()
mc = MetricCricket(33)
print(f"fahrenheit = {mc.fahrenheit()}")
print(f"celsius = {mc.celsius()}")
print()
kc = KelvinCricket(33)
print(f"fahrenheit = {kc.fahrenheit()}")
print(f"celsius = {kc.celsius()}")
print(f"kelvin = {kc.kelvin()}")
print()
print("Is class MetricCricket a subclass of class Cricket? ", end = "")
print(issubclass(MetricCricket, Cricket))
print()
print("Class KelvinCricket and its superclasses are")
for i, cls in enumerate(KelvinCricket.mro(), start = 1): #method resolution order
print(i, cls) #cls is a type object
sys.exit(0)
fahrenheit = 72 fahrenheit = 72 celsius = 22.22222222222222 fahrenheit = 72 celsius = 22.22222222222222 kelvin = 295.3722222222222 Is class MetricCricket a subclass of class Cricket? True Class KelvinCricket and its superclasses are 1 <class '__main__.KelvinCricket'> 2 <class '__main__.MetricCricket'> 3 <class '__main__.Cricket'> 4 <class 'object'>
class Amniote(object):
def __init__(self, amnion):
self.amnion = amnion
class Synapsid(Amniote):
def __init__(self, amnion, synapsidOpening):
super().__init__(amnion)
self.synapsidOpening = synapsidOpening
class Mammal(Synapsid):
def __init__(self, amnion, synapsidOpening, bones):
super().__init__(amnion, synapsidOpening)
self.bones = bones #middle ear bones: incus, malleus, stapes
class Placental(Mammal):
def __init__(self, amnion, synapsidOpening, bones, placenta):
super().__init__(amnion, synapsidOpening, bones)
self.placenta = placenta
amniote = Amniote("amnion")
print(f"amnion = {amniote.amnion}")
print()
synapsid = Synapsid("amnion", "synapsidOpening")
print(f"amnion = {synapsid.amnion}")
print(f"synapsidOpening = {synapsid.synapsidOpening}")
print()
mammal = Mammal("amnion", "synapsidOpening", "bones")
print(f"amnion = {mammal.amnion}")
print(f"synapsidOpening = {mammal.synapsidOpening}")
print(f"bones = {mammal.bones}")
print()
placental = Placental("amnion", "synapsidOpening", "bones", "placenta")
print(f"amnion = {placental.amnion}")
print(f"synapsidOpening = {placental.synapsidOpening}")
print(f"bones = {placental.bones}")
print(f"placenta = {placental.placenta}")
print()
amnion = amnion amnion = amnion synapsidOpening = synapsidOpening amnion = amnion synapsidOpening = synapsidOpening bones = bones amnion = amnion synapsidOpening = synapsidOpening bones = bones placenta = placenta
If you would prefer to list the classes in the reverse order,
simply change
bool.mro()
to
reversed(bool.mro()).
for i, cls in enumerate(bool.mro(), start = 1):
print(i, cls) #cls is a type object
1 <class 'bool'> 2 <class 'int'> 3 <class 'object'>
Why isn’t class
datetime.datetime
also a subclass of class
datetime.time?
import datetime
for i, cls in enumerate(datetime.datetime.mro(), start = 1):
print(i, cls)
1 <class 'datetime.datetime'> 2 <class 'datetime.date'> 3 <class 'object'>
for i, cls in enumerate(TypeError.mro(), start = 1):
print(i, cls)
1 <class 'TypeError'> 2 <class 'Exception'> 3 <class 'BaseException'> 4 <class 'object'>
for i, cls in enumerate(ZeroDivisionError.mro(), start = 1):
print(i, cls)
1 <class 'ZeroDivisionError'> 2 <class 'ArithmeticError'> 3 <class 'Exception'> 4 <class 'BaseException'> 5 <class 'object'>
import sys
try:
infile = open("filename.txt")
except BaseException as error:
print(error, file = sys.stderr)
sys.exit(1)
for i, cls in enumerate(type(infile).mro(), start = 1):
print(i, cls)
infile.close()
1 <class '_io.TextIOWrapper'> 2 <class '_io._TextIOBase'> 3 <class '_io._IOBase'> 4 <class 'object'>
Changing the call to
open
to
infile = open("filename.jpg", "rb") #read binary
1 <class '_io.BufferedReader'> 2 <class '_io._BufferedIOBase'> 3 <class '_io._IOBase'> 4 <class 'object'>
infile = open("filename.jpg", "rb", buffering = 0)
1 <class '_io.FileIO'> 2 <class '_io._RawIOBase'> 3 <class '_io._IOBase'> 4 <class 'object'>
import sys
for i, cls in enumerate(type(sys.stdin).mro(), start = 1): #also try sys.stdout, sys.stderr
print(cls)
1 <class 'idlelib.run.PseudoInputFile'> 2 <class 'idlelib.run.PseudoFile'> 3 <class 'io.TextIOBase'> 4 <class '_io._TextIOBase'> 5 <class 'io.IOBase'> 6 <class '_io._IOBase'> 7 <class 'object'>
import urllib.request
response = urllib.request.urlopen("http://python.org/")
for i, cls in enumerate(type(response).mro(), start = 1):
print(i, cls)
response.close()
1 <class 'http.client.HTTPResponse'> 2 <class 'io.BufferedIOBase'> 3 <class '_io._BufferedIOBase'> 4 <class 'io.IOBase'> 5 <class '_io._IOBase'> 6 <class 'object'>
import threading
for i, cls in enumerate(threading._MainThread.mro(), start = 1):
print(i, cls)
1 <class 'threading._MainThread'> 2 <class 'threading.Thread'> 3 <class 'object'>