Проверить, является ли что-то атрибутом или декоратором в python

Я хочу обернуть модельный класс унаследованной кодовой базы. Класс модели имеет словарь с метаинформацией и свойствами, которые обращаются к этому словарю, а также к атрибутам. Я хочу унифицировать доступ к метаинформации, свойствам и атрибутам с помощью an_object[some_key] использование синтаксиса __getitem__, Проблема в том, что некоторые свойства имеют геттеры, но не сеттеры. Таким образом, попытка проверить, существует ли атрибут (через hasattr), возвращает True, но затем установка этого атрибута завершается неудачей, потому что свойство не определено.

Как я могу решить, могу ли я установить атрибут безопасно или это свойство, которое мне нужно установить в мета-словаре?

1 ответ

Решение

Вы можете определить, является ли что-то свойством, посмотрев на тот же атрибут класса:

class_attribute = getattr(type(instance), some_key, None)
if isinstance(class_attribute, property):
    # this is a property
    if class_attribute.fset is None:
        print "Read-only"

Вы также можете проверить .fget а также .fdel проверить, есть ли у свойства геттер и удалитель соответственно.

Тем не менее, вы всегда можете поймать AttributeError исключение для борьбы с сеттером отсутствует:

>>> class Foo(object):
...     @property
...     def bar(self):
...         return 'spam'
... 
>>> f = Foo()
>>> class_attribute = getattr(type(f), 'bar', None)
>>> isinstance(class_attribute, property)
True
>>> class_attribute.fget
<function bar at 0x10aa8c668>
>>> class_attribute.fset is None
True
>>> try:
...     f.bar = 'baz'
... except AttributeError:
...     print 'Read-only'
... 
Read-only
Другие вопросы по тегам