如果抽象类属性名称输入错误,如何引发异常

时间:2019-05-10 06:22:14

标签: python python-3.x inheritance

如果用户输错了抽象类属性名称并添加了新的类属性而不是覆盖一个新的类属性,我想提出一个例外:

class FooAbstract:
    default_value = 'spam'  # This could be overriden

class MyFoo(FooAbstract):
    defualt_value = 'bar'  # A user mistyped the name and he should be notified

我想difflib.SequenceMatcher可用于验证新添加的变量名:

from difflib import SequenceMatcher

orig_names = set([a for a in dir(FooAbstract) if not a.startswith('__')])
new_names = set(dir(MyFoo)) - set(dir(FooAbstract))

for orig_name in orig_names:
    for new_name in new_names:
        if 0.9 < SequenceMatcher(a=orig_name, b=new_name).ratio() < 1:
            message = f'You probably misstyped "{new_name}" (use "{orig_name}" instead)'
            raise AttributeError(message)

我的问题是,在加载子类MyFoo的过程中应在哪里放置此条件以便执行它?

1 个答案:

答案 0 :(得分:1)

FooAbstract类应定义__init_subclass__init subclas hook是像您这样的测试的最佳场所。它被记录为用于类创建自定义的工具。

  

只要包含类被子类化,就会调用此方法。 cls   然后是新的子类。