diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py
index fc0a2a1..e8756ed 100644
--- a/bindings/python/clang/cindex.py
+++ b/bindings/python/clang/cindex.py
@@ -1628,42 +1628,59 @@ class CompletionChunk:
     def __init__(self, completionString, key):
         self.cs = completionString
         self.key = key
+        self._spelling = None
+        self._kind = None
+        self._raw_kind = None
+        self._string = None
+        self._got_string = False
 
     def __repr__(self):
         return "{'" + self.spelling + "', " + str(self.kind) + "}"
 
     @property
     def spelling(self):
-        return lib.clang_getCompletionChunkText(self.cs, self.key).spelling
+        if self._spelling == None:
+            self._spelling = lib.clang_getCompletionChunkText(self.cs, self.key).spelling
+        return self._spelling
 
     @property
     def kind(self):
-        res = lib.clang_getCompletionChunkKind(self.cs, self.key)
-        return completionChunkKindMap[res]
+        if self._kind == None:
+            self._kind = completionChunkKindMap[self.raw_kind]
+        return self._kind
+    
+    @property
+    def raw_kind(self):
+        if self._raw_kind == None:
+            self._raw_kind = lib.clang_getCompletionChunkKind(self.cs, self.key)
+        return self._raw_kind
 
     @property
     def string(self):
-        res = lib.clang_getCompletionChunkCompletionString(self.cs, self.key)
-
-        if (res):
-          return CompletionString(res)
+        if self._got_string:
+            return self._string
         else:
-          None
+            self._got_string = True
+            res = lib.clang_getCompletionChunkCompletionString(self.cs, self.key)
+            if (res):
+                self._string = CompletionString(res)
+
+        return self._string
 
     def isKindOptional(self):
-      return self.kind == completionChunkKindMap[0]
+      return self.raw_kind == 0
 
     def isKindTypedText(self):
-      return self.kind == completionChunkKindMap[1]
+      return self.raw_kind == 1
 
     def isKindPlaceHolder(self):
-      return self.kind == completionChunkKindMap[3]
+      return self.raw_kind == 3
 
     def isKindInformative(self):
-      return self.kind == completionChunkKindMap[4]
+      return self.raw_kind == 4
 
     def isKindResultType(self):
-      return self.kind == completionChunkKindMap[15]
+      return self.raw_kind == 15
 
 completionChunkKindMap = {
             0: CompletionChunk.Kind("Optional"),
