如何让Python类中的方法仅可通过类直接调用,禁止通过类实例调用
实现方案
直接自定义一个仅允许类调用的方法装饰器即可,基于Python描述符协议实现,原理是访问描述符属性时,如果调用方是实例,__get__方法会收到实例对象,调用方是类则收到None,我们基于这个特征做校验即可:
from functools import wraps class ClassOnlyMethod: def __init__(self, func): self.func = func wraps(func)(self) def __get__(self, instance, owner): # 检测到实例调用直接抛出异常 if instance is not None: raise TypeError(f"方法 {self.__name__} 仅允许通过类 {owner.__name__} 调用,不允许通过实例调用") # 类调用时正常绑定类为第一个参数 @wraps(self.func) def wrapper(*args, **kwargs): return self.func(owner, *args, **kwargs) return wrapper
使用方式
替换原来的@classmethod为@ClassOnlyMethod即可:
class A: def __init__(self, a): self.a = a @ClassOnlyMethod def foo(cls): return 'hello world!'
效果验证
- 类直接调用正常返回:
>>> A.foo() 'hello world!'
- 实例调用直接抛出错误:
>>> A(1).foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 方法 foo 仅允许通过类 A 调用,不允许通过实例调用
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

