如果用户输错了抽象类属性名称并添加了新的类属性而不是覆盖一个新的类属性,我想提出一个例外:
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
的过程中应在哪里放置此条件以便执行它?
答案 0 :(得分:1)
FooAbstract类应定义__init_subclass__
。 init subclas hook是像您这样的测试的最佳场所。它被记录为用于类创建自定义的工具。
只要包含类被子类化,就会调用此方法。 cls 然后是新的子类。