diff --git a/pysnooper/tracer.py b/pysnooper/tracer.py index 6584d94..d8f5ba4 100644 --- a/pysnooper/tracer.py +++ b/pysnooper/tracer.py @@ -233,7 +233,7 @@ class Tracer: return self._wrap_function(function_or_class) def _wrap_class(self, cls): - for attr_name in dir(cls): + for attr_name in cls.__dict__: attr = getattr(cls, attr_name) if inspect.isfunction(attr): setattr(cls, attr_name, self._wrap_function(attr)) diff --git a/tests/test_pysnooper.py b/tests/test_pysnooper.py index 2dfb994..9453d49 100644 --- a/tests/test_pysnooper.py +++ b/tests/test_pysnooper.py @@ -1447,4 +1447,39 @@ def test_class_with_property(): ReturnEntry('pass'), ReturnValueEntry('None'), ) - ) \ No newline at end of file + ) + + +def test_snooping_on_class_does_not_cause_base_class_to_be_snooped(): + string_io = io.StringIO() + + class UnsnoopedBaseClass(object): + def __init__(self): + self.method_on_base_class_was_called = False + + def method_on_base_class(self): + self.method_on_base_class_was_called = True + + @pysnooper.snoop(string_io) + class MyClass(UnsnoopedBaseClass): + def method_on_child_class(self): + self.method_on_base_class() + + instance = MyClass() + + assert not instance.method_on_base_class_was_called + instance.method_on_child_class() + assert instance.method_on_base_class_was_called + + output = string_io.getvalue() + assert_output( + output, + ( + SourcePathEntry(), + VariableEntry('self', value_regex="u?.*.MyClass object at"), + CallEntry('def method_on_child_class(self):'), + LineEntry('self.method_on_base_class()'), + ReturnEntry('self.method_on_base_class()'), + ReturnValueEntry('None'), + ) + )