如何编写mixin,如果未正确创建使用此特定mixin的类,则会引发异常。
如果我在mixin的__init__或__new__方法中执行这些检查和平衡,则在此错误类尝试创建实例时会引发异常。哪个晚了,理想情况下,当编译器检测到错误的类时,需要抛出异常。 (假设,如何检测一个类是否可接受是一件小事)
说明问题
class ASampleMixin:
"""
A sample docstring
"""
def a_method(self):
raise NotImplementedError
def class_rule(self):
if something is wrong:
return False
return True
# more methods
class AClass(ASampleMixin, BaseClass):
"""
This class should satisfy a condition specified in class_rule method of the mixin
"""
# some methods
我现在正在使用mixin的 init 方法执行检查。如果规则返回False,则会引发异常。现在需要在解释器读取AClass时完成,而不是在我尝试创建AClass实例时。
即使在像Python 3.5这样的动态类型语言中也可以吗?
答案 0 :(得分:2)
这听起来好像你想要创建一个自定义元类,它在创建类对象时执行检查。请参阅documentation for metaclasses。
答案 1 :(得分:0)
作为参考的元类示例:
class CustomType(type):
def __call__(cls, *args, **kwargs):
if not CustomType.some_rule(kwargs.pop('some_attr', None)):
raise Exception('Abort! Abort!')
return super(CustomType, cls).__call__(*args, **kwargs)
@staticmethod
def some_rule(var):
if type(var) is not str:
return False
return True
class A(object):
__metaclass__ = CustomType
class B(A):
pass
b = B(some_attr='f') # all is well
b = B() # raises