hasattr по именам классов

Документация hasattr говорит, что он берет объект и имя атрибута и сообщает вам, существует ли этот атрибут в этом объекте.

Я обнаружил, что он, кажется, работает и с именами классов (т.е. не объект экземпляра).

Что-то вроде:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 

Я хотел бы использовать это для облегчения написания некоторого тестового кода, но не хочу, чтобы его укусили позже, если это побочный эффект от реализации и не предназначен.

Пожалуйста, не просите посмотреть тестовый код, чтобы увидеть, могу ли я сделать что-то еще, так как это не совсем вопрос.

Есть ли официальная позиция питона по этому поводу? Я предполагаю, что объект, о котором идет речь, в документации говорит об объекте экземпляра.

Я попытался поискать в Google (и смотрел на некоторые вопросы в Stackru), но, похоже, ничего не нашел.

3 ответа

Решение

Тот факт, что это работает на class в дополнение к экземпляру является преднамеренным. По факту, hasattr должен работать на любом объекте, который вы передаете ему. По сути, он делает что-то вроде этого:

def hasattr(obj, attribute):
    try:
        getattr(obj, attribute)
    except:
        return False
    return True

Вы можете положиться на это и не бояться стать немного позже. Обратите внимание, что на python-dev есть некоторые обсуждения hasattr быть сломанным дизайном. Суть в том, что hasattr ловит любое исключение, которое может вводить в заблуждение.


Обратите внимание, что в Python классы сами по себе являются экземплярами type,

>>> class Foo(object):
...   pass
... 
>>> type(Foo)
<type 'type'>

так что все является примером чего-то 1.

1 type это сам по себе пример, который было бы невозможно сделать на чистом питоне...

У меня нет ссылки на "официальную позицию Python", но это совершенно нормально и намеренно. Помни что

instance_of_SomeClass.some_method(parameters, ...)

на самом деле синтаксический сахар для

SomeClass.some_method(instance_of_SomeClass, parameters, ...)

т.е. эти методы на самом деле являются атрибутами класса и, следовательно, могут быть проверены с hasattr,

Просто хочу ссылку (даже для предложения, что все является объектом...)

Я рекомендую вам прочитать эту главу (или всю книгу, если у вас есть время):

http://www.diveintopython.net/getting_to_know_python/everything_is_an_object.html

Другие вопросы по тегам