मैं अपने स्वयं के दृष्टिकोण का उपयोग कई विरासत परिदृश्य के अंदर सुरक्षा के साथ सुपर को कॉल करने के लिए करता हूं (मैंने सभी कोड डाल दिए हैं)
def safe_super(_class, _inst):
"""safe super call"""
try:
return getattr(super(_class, _inst), _inst.__fname__)
except:
return (lambda *x,**kx: None)
def with_name(function):
def wrap(self, *args, **kwargs):
self.__fname__ = function.__name__
return function(self, *args, **kwargs)
return wrap
नमूना उपयोग:
class A(object):
def __init__():
super(A, self).__init__()
@with_name
def test(self):
print 'called from A\n'
safe_super(A, self)()
class B(object):
def __init__():
super(B, self).__init__()
@with_name
def test(self):
print 'called from B\n'
safe_super(B, self)()
class C(A, B):
def __init__():
super(C, self).__init__()
@with_name
def test(self):
print 'called from C\n'
safe_super(C, self)()
इसका परीक्षण:
a = C()
a.test()
उत्पादन:
called from C
called from A
called from B
प्रत्येक @with_name सजाया विधि के अंदर आप वर्तमान समारोह के नाम के रूप में स्वयं .__ fname__ तक पहुंच रखते हैं।
traceback
। जवाब और टिप्पणियों का समय भी नहीं लगता है।