|
"""class tools, including method inspection, class attributes, inheritance relationships, etc.""" |
|
|
|
|
|
def check_methods(C, *methods): |
|
"""Check if the class has methods. borrow from _collections_abc. |
|
|
|
Useful when implementing implicit interfaces, such as defining an abstract class, isinstance can be used for determination without inheritance. |
|
""" |
|
mro = C.__mro__ |
|
for method in methods: |
|
for B in mro: |
|
if method in B.__dict__: |
|
if B.__dict__[method] is None: |
|
return NotImplemented |
|
break |
|
else: |
|
return NotImplemented |
|
return True |
|
|