python - 如何创建一个具有不能被其子类继承的公共方法的类?
问题描述
我想做这样的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
属性将变得不可见f
B
class B(A):
pass
b = B()
b.g() #prints A.g
b.f() #error: no such attribute
我怎样才能做到这一点@someDecorator
?
解决方案
一种方法是检查__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