我基本上想要创建一个子类,在超类上“隐藏”方法,以便它们不会出现在dir()
或hasattr()
调用中,并且用户无法调用它们(在至少不通过任何正常渠道)。我也想用尽可能少的“魔法”来做到这一点。感谢。
答案 0 :(得分:6)
分别覆盖__dir__
和__getattribute__
方法应该可以解决问题。这是在Python中执行此类操作的规范方法。虽然你是否真的应该这样做完全是另一回事。
请参阅Customizing Attribute Access
上的Python文档 使用__dir__
列出可用属性(这不会影响实际的属性访问)
class A(object):
def __dir__(self):
return []
>>> print dir(A())
[]
使用__getattribute__
来控制实际的属性访问
class A(object):
def __getattribute__(self, attr):
"""Prevent 'private' attribute access"""
if attr.startswith('_'):
raise AttributeError
return object.__getattribute__(self, attr)
>>> a = A()
>>> a.x = 5
>>> a.x
5
>>> a._x = 3
>>> a._x
AttributeError
这可能是你想要做的。
class NoSuper(object):
def __getattribute__(self, attr):
"""Prevent accessing inherited attributes"""
for base in self.__bases__:
if hasattr(base, attr):
raise AttributeError
return object.__getattribute__(self, attr)
答案 1 :(得分:3)
你不应该是子类,你应该使用组合。将您的其他类实例包装在新的类实例中并根据需要使用。