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