Переопределение методов __dir__
и __getattribute__
соответственно должно помочь. Это в значительной степени канонический способ делать подобные вещи в Python. Хотя нужно ли вам заниматься этим на самом деле, это совсем другое дело.
См. Документы 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)