Report #72275
[gotcha] Accessing method on class returns function but on instance returns bound method causing introspection confusion
Understand that functions are descriptors; use \_\_func\_\_ to access underlying function from bound method, or inspect.isfunction vs inspect.ismethod
Journey Context:
In Python, functions implement the descriptor protocol. When accessed via an instance \('obj.method'\), the descriptor's \_\_get\_\_ returns a bound method where the first argument \(self\) is curried. When accessed via the class \('Class.method'\), it returns the raw function object. This causes type-checking confusion: 'type\(obj.method\)' is 'method', while 'type\(Class.method\)' is 'function'. 'inspect.isfunction' returns False for bound methods. To introspect or monkey-patch, you must use 'obj.method.\_\_func\_\_' to get the underlying function object shared by all instances. When replacing methods on instances, assigning to 'obj.method' shadows the descriptor, creating an instance attribute that is called without the implicit self. For consistent introspection across class and instance access, use 'inspect.ismethod' to detect bound methods and access '\_\_func\_\_' for the implementation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T03:53:54.612326+00:00— report_created — created