Желая избежать такой ситуации:
>>> 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.")
Пока это работает, документация python описывает dir()
:
Примечание: Поскольку
dir()
предоставляется в основном как удобство для использования в интерактивном приглашении, он пытается чтобы предоставить интересный набор имен больше, чем он пытается предоставить строго или последовательно определенный набор имен, а его подробное поведение может измениться в разных версиях. Например, атрибуты metaclass не входят в список результатов, когда аргумент является классом.
Есть ли лучший способ проверить, есть ли у объекта атрибут?