Как «спрятать» методы суперкласса в подклассе - PullRequest
6 голосов
/ 29 апреля 2011

Я в основном хочу создать подкласс, который «скрывает» методы в суперклассе, чтобы они не отображались при вызове dir() или hasattr() и пользователи не могли бы их вызывать (по крайней мере, черезнормальных каналов).Я также хотел бы сделать это с наименьшим количеством "волшебства".Спасибо.

Ответы [ 2 ]

6 голосов
/ 29 апреля 2011

Переопределение методов __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)
3 голосов
/ 29 апреля 2011

Тогда вы не должны создавать подклассы, вы должны использовать композицию. Оберните ваш другой экземпляр класса в новый экземпляр класса и используйте при необходимости.

...