code: def _set_cache_(self, attr):
          
          if attr in TagObject.__slots__:
              ostream = self.repo.odb.stream(self.binsha)
              lines = ostream.read().decode(defenc).splitlines()
  
              obj, hexsha = lines[0].split(" ")       # object <hexsha> @UnusedVariable
              type_token, type_name = lines[1].split(" ")  # type <type_name> @UnusedVariable
              self.object = \
                  get_object_type_by_name(type_name.encode('ascii'))(self.repo, hex_to_bin(hexsha))
  
              self.tag = lines[2][4:]  # tag <tag name>
  
              tagger_info = lines[3]  # tagger <actor> <date>
              self.tagger, self.tagged_date, self.tagger_tz_offset = parse_actor_and_date(tagger_info)
  
              # line 4 empty - it could mark the beginning of the next header
              # in case there really is no message, it would not exist. Otherwise
              # a newline separates header from message
              if len(lines) > 5:
                  self.message = "\n".join(lines[5:])
              else:
                  self.message = ''
          # END check our attributes
          else:
              super(TagObject, self)._set_cache_(attr)
docs: Cache all our attributes at once