Желая избежать ситуации, подобной этой:
>>> class Point:
x = 0
y = 0
>>> a = Point()
>>> a.X = 4 #whoops, typo creates new attribute capital x
Я создал следующий объект для использования в качестве суперкласса:
class StrictObject(object):
def __setattr__(self, item, value):
if item in dir(self):
object.__setattr__(self, item, value)
else:
raise AttributeError("Attribute " + item + " does not exist.")
Хотя это, кажется, работает, питон *В документации 1007 * говорится о dir()
:
Примечание: Поскольку dir()
поставляется в основном для удобства использования в интерактивном режимеПодсказка: он пытается предоставить интересный набор имен больше, чем он пытается предоставить строго или последовательно определенный набор имен, и его детальное поведение может меняться в разных выпусках.Например, атрибуты метакласса отсутствуют в списке результатов, когда аргумент является классом.
Есть ли лучший способ проверить наличие атрибута у объекта?