Skip to content

Instantly share code, notes, and snippets.

@yinyin
Last active May 20, 2017 11:37
Show Gist options
  • Save yinyin/21700ef092dacc6feb5fd0ba06ebf9d9 to your computer and use it in GitHub Desktop.
Save yinyin/21700ef092dacc6feb5fd0ba06ebf9d9 to your computer and use it in GitHub Desktop.
Python MRO Experiment
# -*- coding: utf-8 -*-
""" MRO Experiment
$ python -i mro_exp.py
>>> a = GD1(1, 2, 3, 4, 5, 6, 7, 8)
_Base(*args=(), **kwds={})
CL3(cparam3a=7, cparam3b=8, *args=(), **kwds={})
CL2(cparam2a=5, cparam2b=6, *args=(7, 8), **kwds={})
CL1(cparam1a=3, cparam1b=4, *args=(5, 6, 7, 8), **kwds={})
GD1(gparam1a=1, gparam1b=2, *args=(3, 4, 5, 6, 7, 8), **kwds={})
>>> a.func(1, 2, 3, 4, 5, 6, 7, 8, 9)
_Base.func(*args=(9,), **kwds={})
CL3.func(fparam3a=7, fparam3b=8, *args=(9,), **kwds={}) / p_ret=-9
CL2.func(fparam2a=5, fparam2b=6, *args=(7, 8, 9), **kwds={}) / p_ret=-3
CL1.func(fparam1a=3, fparam1b=4, *args=(5, 6, 7, 8, 9), **kwds={}) / p_ret=-2
GD1.func(gparam1a=1, gparam1b=2, *args=(3, 4, 5, 6, 7, 8, 9), **kwds={}) / p_ret=-1
11
>>> a.showsuper()
_Base.super: <super: <class '_Base'>, <GD1 object>>
CL3.super: <super: <class 'CL3'>, <GD1 object>>
CL2.super: <super: <class 'CL2'>, <GD1 object>>
CL1.super: <super: <class 'CL1'>, <GD1 object>>
GD1.super: <super: <class 'GD1'>, <GD1 object>>
>>> GD1.sfunc(1, 2, 3, 4, 5, 6, 7, 8, 9)
_Base.sfunc(*args=(9,), **kwds={})
CL3.sfunc(fparam3a=7, fparam3b=8, *args=(9,), **kwds={}) / p_ret=-9
CL2.sfunc(fparam2a=5, fparam2b=6, *args=(7, 8, 9), **kwds={}) / p_ret=-3
CL1.sfunc(fparam1a=3, fparam1b=4, *args=(5, 6, 7, 8, 9), **kwds={}) / p_ret=-2
GD1.sfunc(gparam1a=1, gparam1b=2, *args=(3, 4, 5, 6, 7, 8, 9), **kwds={}) / p_ret=-1
11
"""
class _Base(object):
def __init__(self, *args, **kwds):
super(_Base, self).__init__(*args, **kwds)
print "_Base(*args=%r, **kwds=%r)" % (args, kwds,)
# ### def __init__
def func(self, *args, **kwds):
print "_Base.func(*args=%r, **kwds=%r)" % (args, kwds,)
return -9
# ### def func
def showsuper(self):
print "_Base.super: %r" % (super(_Base, self),)
# ### def showsuper
@classmethod
def sfunc(cls, *args, **kwds):
print "_Base.sfunc(*args=%r, **kwds=%r)" % (args, kwds,)
return -9
# ### def func
# ### class _Base
class CL1(_Base):
def __init__(self, cparam1a, cparam1b, *args, **kwds):
super(CL1, self).__init__(*args, **kwds)
print "CL1(cparam1a=%r, cparam1b=%r, *args=%r, **kwds=%r)" % (cparam1a, cparam1b, args, kwds,)
# ### def __init__
def func(self, fparam1a, fparam1b, *args, **kwds):
p_ret = super(CL1, self).func(*args, **kwds)
print "CL1.func(fparam1a=%r, fparam1b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam1a, fparam1b, args, kwds, p_ret,)
return -1
# ### def func
def showsuper(self):
super(CL1, self).showsuper()
print "CL1.super: %r" % (super(CL1, self),)
# ### def showsuper
@classmethod
def sfunc(cls, fparam1a, fparam1b, *args, **kwds):
p_ret = super(CL1, cls).sfunc(*args, **kwds)
print "CL1.sfunc(fparam1a=%r, fparam1b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam1a, fparam1b, args, kwds, p_ret,)
return -1
# ### def sfunc
# ### class CL1
class CL2(_Base):
def __init__(self, cparam2a, cparam2b, *args, **kwds):
super(CL2, self).__init__(*args, **kwds)
print "CL2(cparam2a=%r, cparam2b=%r, *args=%r, **kwds=%r)" % (cparam2a, cparam2b, args, kwds,)
# ### def __init__
def func(self, fparam2a, fparam2b, *args, **kwds):
p_ret = super(CL2, self).func(*args, **kwds)
print "CL2.func(fparam2a=%r, fparam2b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam2a, fparam2b, args, kwds, p_ret,)
return -2
# ### def func
def showsuper(self):
super(CL2, self).showsuper()
print "CL2.super: %r" % (super(CL2, self),)
# ### def showsuper
@classmethod
def sfunc(cls, fparam2a, fparam2b, *args, **kwds):
p_ret = super(CL2, cls).sfunc(*args, **kwds)
print "CL2.sfunc(fparam2a=%r, fparam2b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam2a, fparam2b, args, kwds, p_ret,)
return -2
# ### def sfunc
# ### class CL2
class CL3(_Base):
def __init__(self, cparam3a, cparam3b, *args, **kwds):
super(CL3, self).__init__(*args, **kwds)
print "CL3(cparam3a=%r, cparam3b=%r, *args=%r, **kwds=%r)" % (cparam3a, cparam3b, args, kwds,)
# ### def __init__
def func(self, fparam3a, fparam3b, *args, **kwds):
p_ret = super(CL3, self).func(*args, **kwds)
print "CL3.func(fparam3a=%r, fparam3b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam3a, fparam3b, args, kwds, p_ret,)
return -3
# ### def func
def showsuper(self):
super(CL3, self).showsuper()
print "CL3.super: %r" % (super(CL3, self),)
# ### def showsuper
@classmethod
def sfunc(cls, fparam3a, fparam3b, *args, **kwds):
p_ret = super(CL3, cls).sfunc(*args, **kwds)
print "CL3.sfunc(fparam3a=%r, fparam3b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (fparam3a, fparam3b, args, kwds, p_ret,)
return -3
# ### def sfunc
# ### class CL3
class GD1(CL1, CL2, CL3):
def __init__(self, gparam1a, gparam1b, *args, **kwds):
super(GD1, self).__init__(*args, **kwds)
print "GD1(gparam1a=%r, gparam1b=%r, *args=%r, **kwds=%r)" % (gparam1a, gparam1b, args, kwds,)
# ### def __init__
def func(self, gparam1a, gparam1b, *args, **kwds):
p_ret = super(GD1, self).func(*args, **kwds)
print "GD1.func(gparam1a=%r, gparam1b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (gparam1a, gparam1b, args, kwds, p_ret,)
return 11
# ### def func
def showsuper(self):
super(GD1, self).showsuper()
print "GD1.super: %r" % (super(GD1, self),)
# ### def showsuper
@classmethod
def sfunc(cls, gparam1a, gparam1b, *args, **kwds):
p_ret = super(GD1, cls).sfunc(*args, **kwds)
print "GD1.sfunc(gparam1a=%r, gparam1b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (gparam1a, gparam1b, args, kwds, p_ret,)
return 11
# ### def sfunc
# ### class GD1
class GD2(CL2, CL3, CL1):
def __init__(self, gparam2a, gparam2b, *args, **kwds):
super(GD2, self).__init__(*args, **kwds)
print "GD2(gparam2a=%r, gparam2b=%r, *args=%r, **kwds=%r)" % (gparam2a, gparam2b, args, kwds,)
# ### def __init__
def func(self, gparam2a, gparam2b, *args, **kwds):
p_ret = super(GD2, self).func(*args, **kwds)
print "GD2.func(gparam2a=%r, gparam2b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (gparam2a, gparam2b, args, kwds, p_ret,)
return 11
# ### def func
def showsuper(self):
super(GD2, self).showsuper()
print "GD2.super: %r" % (super(GD2, self),)
# ### def showsuper
@classmethod
def sfunc(cls, gparam2a, gparam2b, *args, **kwds):
p_ret = super(GD2, cls).func(*args, **kwds)
print "GD2.func(gparam2a=%r, gparam2b=%r, *args=%r, **kwds=%r) / p_ret=%r" % (gparam2a, gparam2b, args, kwds, p_ret,)
return 11
# ### def sfunc
# ### class GD2
# vim: ts=4 sw=4 ai nowrap
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment