Wishing to avoid a situation like this:
>>> class Point:
x = 0
y = 0
>>> a = Point()
>>> a.X = 4 #whoops, typo creates new attribute capital x
I created the following object to be used as a superclass:
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.")
While this seems to work, the python documentation says of dir():
Note: Because
dir()is supplied primarily as a convenience for use at an interactive prompt, it tries to supply an interesting set of names more than it tries to supply a rigorously or consistently defined set of names, and its detailed behavior may change across releases. For example, metaclass attributes are not in the result list when the argument is a class.
Is there a better way to check if an object has an attribute?
Much better ways.
The most common way is "we’re all consenting adults". That means, you don’t do any checking, and you leave it up to the user. Any checking you do makes the code less flexible in it’s use.
But if you really want to do this, there is
__slots__by default in Python 3.x, and for new-style classes in Python 2.x:For example:
And finally, the proper way to check if an object has a certain attribute is not to use
dir, but to use the built-in functionhasattr(object, name).