Python如何定义仅父类可调用、子类实例不可访问的独有方法?
实现方案
最简实现
直接在父类方法内添加类型校验,判断当前实例的类型是否严格等于Base,不符合则抛出指定异常:
class Base: def superclass_only(self): # 仅当实例类型严格为Base时才允许执行 if type(self) is not Base: raise AttributeError(f"'{type(self).__name__}' object has no attribute 'superclass_only'") return 'yes' class Foo(Base): pass
测试效果
父类实例调用正常返回结果:
>>> base = Base() >>> base.superclass_only() 'yes'
子类实例调用抛出预期异常:
>>> foo = Foo() >>> foo.superclass_only() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in superclass_only AttributeError: 'Foo' object has no attribute 'superclass_only'
可复用装饰器方案
如果需要给多个方法添加「仅父类可调用」的限制,可以封装为装饰器避免重复代码:
def superclass_only(method): def wrapper(self, *args, **kwargs): # 自动获取方法所属的父类名做校验 base_cls_name = method.__qualname__.split('.')[0] if type(self).__name__ != base_cls_name: raise AttributeError(f"'{type(self).__name__}' object has no attribute '{method.__name__}'") return method(self, *args, **kwargs) return wrapper # 直接给目标方法加装饰器即可 class Base: @superclass_only def superclass_only(self): return 'yes' class Foo(Base): pass
注意事项
这里必须使用type(self) is Base做判断,不能用isinstance(self, Base):后者对所有继承自Base的子类实例也会返回True,无法达到区分子类和父类实例的效果。
内容的提问来源于stack exchange,提问作者yixuan
相关产品推荐
相关产品推荐

