<p>没有框架检查你是做不到的,这是不允许的。在</p>
<p>下面是我在网上找到的一个执行框架检查的实现:</p>
<pre><code>import sys
class _super(object):
__name__ = 'super'
__slots__ = ('_super__super', '_super__method')
def __init__(self, super, name):
object.__setattr__(self, '_super__super', super)
try:
object.__setattr__(self, '_super__method', getattr(super, name))
except AttributeError:
object.__setattr__(self, '_super__method', name)
def __call__(self, *p, **kw):
method = object.__getattribute__(self, '_super__method')
try:
return method(*p, **kw)
except TypeError:
if type(method) is not str:
raise
super = object.__getattribute__(self, '_super__super')
method = getattr(super, method)
object.__setattr__(self, '_super__method', method)
return method(*p, **kw)
def __getattribute__ (self, name):
super = object.__getattribute__(self, '_super__super')
try:
return getattr(super, name)
except (TypeError, AttributeError):
if name == 'super':
raise TypeError("Cannot get 'super' object of 'super' object")
raise
def __setattr__(self, name, value):
super = object.__getattribute__(self, '_super__super')
object.__setattr__(super, name, value)
def _getSuper(self):
frame = sys._getframe().f_back
code = frame.f_code
name = code.co_name
cur_class = None
for c in type(self).__mro__:
try:
m = getattr(c, name)
func_code = m.func_code
except AttributeError:
func_code = None
if func_code is code:
cur_class = c
elif cur_class is not None:
break
if cur_class is None:
raise TypeError, "Can only call 'super' in a bound method"
return _super(super(cur_class, self), name)
class autosuper(object):
__slots__ = ()
super = property(_getSuper)
</code></pre>
<p>使用代码时:</p>
^{pr2}$
<p>在<a href="http://docs.python.org/py3k/library/functions.html#super" rel="nofollow">python3, ^{<cd1>} is already magical</a>上,并且可以在不传递类的情况下工作:</p>
<pre><code>super().method(args)
</code></pre>