Как я могу переопределить доступ к атрибуту класса в Python? - PullRequest
9 голосов
/ 22 марта 2012

Как я могу переопределить доступ к атрибутам класса в python?

P.S. Есть ли способ оставить обычный доступ к атрибутам класса в одиночку, но вызвать более конкретное исключение для отсутствующего атрибута?

Ответы [ 2 ]

17 голосов
/ 22 марта 2012

Волшебный метод __getattr__ вызывается, когда атрибут не существует в экземпляре / классе / родительских классах.Вы бы использовали его для создания специального исключения для отсутствующего атрибута:

class Foo(object):
    def __getattr__(self, attr):
        #only called what self.attr doesn't exist
        raise MyCustonException(attr)

Если вы хотите настроить доступ к атрибутам класса, вам нужно определить __getattr__ для метакласса / типа:

class BooType(type):
    def __getattr__(self, attr):
        print attr
        return attr

class Boo(object):
    __metaclass__ = BooType

boo = Boo()
Boo.asd # prints asd
boo.asd # raises an AttributeError like normal

Если вы хотите настроить доступ к атрибуту all , используйте магический метод __getattribute__.

2 голосов
/ 27 октября 2012

ответ agf является правильным, и на самом деле ответ, который я собираюсь дать, основан на нем и должен дать ему кредит.

Просто чтобы дать больше подробностей о классесторона атрибута, то есть та часть, которая на самом деле здесь находится под вопросом (в отличие от различия между __getattr__ и __getattribute__), я хотел бы добавить ссылку на ответ, который я написал на другой аналогичный вопрос , в которой более подробно рассматривается различие между атрибутами класса и экземпляра, как это реализовано и почему необходимо использовать метакласс, чтобы влиять на поиск атрибутов класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...