Index: template/tests/eval.py
===================================================================
--- template/tests/eval.py	(revision 803)
+++ template/tests/eval.py	(working copy)
@@ -345,8 +345,16 @@
             def prop(self):
                 raise NotImplementedError
             prop = property(prop)
+            def another_prop(self):
+                raise AttributeError
+            another_prop = property(another_prop)
+        class SomethingSubclass(Something):
+            pass
         self.assertRaises(NotImplementedError,
                           Expression('s.prop').evaluate, {'s': Something()})
+        self.assertRaises(AttributeError,
+                          Expression('s.another_prop').evaluate,
+                          {'s': SomethingSubclass()})
 
     def test_getitem_undefined_string(self):
         class Something(object):
Index: template/eval.py
===================================================================
--- template/eval.py	(revision 803)
+++ template/eval.py	(working copy)
@@ -272,12 +272,17 @@
 
     def lookup_attr(cls, data, obj, key):
         __traceback_hide__ = True
-        val = getattr(obj, key, UNDEFINED)
-        if val is UNDEFINED:
-            try:
-                val = obj[key]
-            except (KeyError, TypeError):
-                val = cls.undefined(key, owner=obj)
+        try:
+            val = getattr(obj, key)
+        except AttributeError:
+            # see ticket #191
+            if hasattr(obj.__class__, key):
+                raise
+            else:
+                try:
+                    val = obj[key]
+                except (KeyError, TypeError):
+                    val = cls.undefined(key, owner=obj)
         return val
     lookup_attr = classmethod(lookup_attr)
 

