ทันควันกับ @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
จะพบข้อผิดพลาดได้เร็วขึ้น