Tôi thực hiện phương pháp của riêng mình được sử dụng để gọi siêu với sự an toàn bên trong nhiều kịch bản thừa kế (tôi đặt tất cả mã)
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
sử dụng mẫu:
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)()
kiểm tra nó:
a = C()
a.test()
đầu ra:
called from C
called from A
called from B
Bên trong mỗi phương thức trang trí @with_name, bạn có quyền truy cập vào chính mình .__ fname__ làm tên hàm hiện tại.
traceback
. Thậm chí không có thời gian của câu trả lời và ý kiến dường như ủng hộ nó.