如何用元类实现Python非实例化泛型类(含单一方法)
实现不可实例化的泛型类(依赖类属性的类方法)
你的需求不需要复杂的元类就能实现,用类方法结合实例化拦截即可满足要求,如果你确实想尝试元类方案,也可以参考下面两种实现方式:
方案1:类方法+实例化拦截(推荐)
通过重写__init__阻止实例化,用类方法自动绑定当前类,直接访问类属性:
class GenericClass: attr_a = 0 attr_b = 0 def __init__(self): # 禁止生成实例 raise TypeError("该类不能创建实例") @classmethod def count(cls, text): # cls自动指向调用该方法的类(子类调用时就是子类本身) return len(text) / cls.attr_a + cls.attr_b class A(GenericClass): attr_a = 2 attr_b = 1 text = "Hello, I'm under the water" print(A.count(text)) # 输出 14.0 # 尝试实例化会触发报错:obj = GenericClass()
方案2:元类实现禁止实例化
如果你一定要用元类,可以通过元类拦截实例化操作:
class NoInstanceMeta(type): def __call__(cls, *args, **kwargs): # 拦截所有实例化请求 raise TypeError("该类不能创建实例") class GenericClass(metaclass=NoInstanceMeta): attr_a = 0 attr_b = 0 @classmethod def count(cls, text): return len(text) / cls.attr_a + cls.attr_b class A(GenericClass): attr_a = 2 attr_b = 1 text = "Hello, I'm under the water" print(A.count(text)) # 输出 14.0 # 尝试实例化会触发报错:obj = A()
原代码的问题说明
你提供的示例代码中,count方法没有绑定类或实例,直接调用时无法找到attr_a和attr_b变量。必须通过类(或类方法的cls参数)明确访问类属性,才能让子类继承后自动使用自身的属性值。
内容的提问来源于stack exchange,提问作者Adam Nowakowski
相关产品推荐
相关产品推荐

