在不正确地定义类时引发异常

时间:2016-02-19 17:38:10

标签: python oop python-3.x metaprogramming

如何编写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这样的动态类型语言中也可以吗?

2 个答案:

答案 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