You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:45:04