首页 > 解决方案 > 如何创建一个具有不能被其子类继承的公共方法的类?

问题描述

我想做这样的A

class A:
    @someDecorator
    def f(self):
        print('A.f')

    def g(self):
        print('A.g')

我可以像这样使用它

a = A()
a.f() #prints A.f
a.g() #prints A.g

但是如果我将一个类声明B为 的子类,则类的A属性将变得不可见fB

class B(A):
    pass

b = B()
b.g() #prints A.g
b.f() #error: no such attribute

我怎样才能做到这一点@someDecorator

标签: pythonpython-3.xinheritance

解决方案


一种方法是检查__class__方法,如果匹配则返回A

def disable_method(func):
   def func_wrapper(name):
       if name.__class__ == A:
           return func(name)
       else:
           raise AttributeError("Cannot call inherited method")
   return func_wrapper

class A:
    @disable_method
    def f(self):
        print('A.f')

    def g(self):
        print('A.g')

class B(A):
    pass

a = A()
a.f()
#A.f

b = B()
b.f()
#AttributeError: Cannot call inherited method

编辑:再看一遍,可以检查方法的类是否有超类__bases__。只要它被用作装饰器,它就应该工作。

def disable_method(func):
    def func_wrapper(name):
        if name.__class__.__bases__ == object:
            return func(name)
        else:
            raise AttributeError("Cannot call method from superclass")
    return func_wrapper

推荐阅读