Last active
May 20, 2017 11:37
-
-
Save yinyin/21700ef092dacc6feb5fd0ba06ebf9d9 to your computer and use it in GitHub Desktop.
Python MRO Experiment
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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