@Mkorpela महान उत्तर पर सुधार , यहां एक संस्करण है
अधिक सटीक जाँच, नामकरण, और त्रुटि ऑब्जेक्ट्स को उठाया
def overrides(interface_class):
"""
Function override annotation.
Corollary to @abc.abstractmethod where the override is not of an
abstractmethod.
Modified from answer https://stackoverflow.com/a/8313042/471376
"""
def confirm_override(method):
if method.__name__ not in dir(interface_class):
raise NotImplementedError('function "%s" is an @override but that'
' function is not implemented in base'
' class %s'
% (method.__name__,
interface_class)
)
def func():
pass
attr = getattr(interface_class, method.__name__)
if type(attr) is not type(func):
raise NotImplementedError('function "%s" is an @override'
' but that is implemented as type %s'
' in base class %s, expected implemented'
' type %s'
% (method.__name__,
type(attr),
interface_class,
type(func))
)
return method
return confirm_override
यह वही है जो व्यवहार में दिखता है:
NotImplementedError
" बेस क्लास में लागू नहीं "
class A(object):
# ERROR: `a` is not a implemented!
pass
class B(A):
@overrides(A)
def a(self):
pass
अधिक वर्णनात्मक NotImplementedError
त्रुटि के परिणामस्वरूप
function "a" is an @override but that function is not implemented in base class <class '__main__.A'>
पूर्ण हो चुकी है
Traceback (most recent call last):
…
File "C:/Users/user1/project.py", line 135, in <module>
class B(A):
File "C:/Users/user1/project.py", line 136, in B
@overrides(A)
File "C:/Users/user1/project.py", line 110, in confirm_override
interface_class)
NotImplementedError: function "a" is an @override but that function is not implemented in base class <class '__main__.A'>
NotImplementedError
" अपेक्षित कार्यान्वित प्रकार "
class A(object):
# ERROR: `a` is not a function!
a = ''
class B(A):
@overrides(A)
def a(self):
pass
अधिक वर्णनात्मक NotImplementedError
त्रुटि के परिणामस्वरूप
function "a" is an @override but that is implemented as type <class 'str'> in base class <class '__main__.A'>, expected implemented type <class 'function'>
पूर्ण हो चुकी है
Traceback (most recent call last):
…
File "C:/Users/user1/project.py", line 135, in <module>
class B(A):
File "C:/Users/user1/project.py", line 136, in B
@overrides(A)
File "C:/Users/user1/project.py", line 125, in confirm_override
type(func))
NotImplementedError: function "a" is an @override but that is implemented as type <class 'str'> in base class <class '__main__.A'>, expected implemented type <class 'function'>
@Mkorpela उत्तर के बारे में महान बात यह है कि चेक कुछ आरंभीकरण चरण के दौरान होता है। चेक को "चलाने" की आवश्यकता नहीं है। पूर्व उदाहरणों का उल्लेख करते हुए, class B
कभी भी प्रारंभिक ( B()
) अभी तक नहीं NotImplementedError
उठाया जाएगा। इसका मतलब है कि overrides
त्रुटियां जल्द पकड़ी जाती हैं।