diff --git a/stix2/base.py b/stix2/base.py index f7ab932..7f9db3f 100644 --- a/stix2/base.py +++ b/stix2/base.py @@ -78,7 +78,7 @@ class _STIXBase(collections.Mapping): raise DependentPropertiesError(self.__class__, failed_dependency_pairs) def _check_object_constraints(self): - if self.granular_markings: + if hasattr(self, "granular_markings") and self.granular_markings: for m in self.granular_markings: # TODO: check selectors pass @@ -124,7 +124,16 @@ class _STIXBase(collections.Mapping): # Handle attribute access just like key access def __getattr__(self, name): - return self.get(name) + # If the requested attribute is not None return its value + if self.get(name) is not None: + return self.get(name) + # Otherwise check the attribute exists inside object. If it exists + # return None. If not raise the AttributeError. + elif name in self._properties: + return None + + raise AttributeError("'%s' object has no attribute '%s'" % + (self.__class__.__name__, name)) def __setattr__(self, name, value): if name != '_inner' and not name.startswith("_STIXBase__"):