jajabarr
jajabarr

Reputation: 561

Self Attributes Live in Function Pointer?

Suppose I have a simple python3 class like so:

class Test():
    def __init__(self):
        self.a = 'a'
    def checkIsA(self, checkA):
        return self.a == checkA

And some further code such as:

def tester(func, item):
    return func(item)

testObject = Test()
print(tester(testObject.checkIsA, 'a'))  # prints True

How is the function pointer(?) checkIsA still aware of its class member variables (defined by self) when used independently by another function?

I want to use this functionality in a program I'm writing but I'm worried I'm not understanding these semantics correctly.

Upvotes: 0

Views: 33

Answers (1)

zwer
zwer

Reputation: 25799

testObject.checkIsA is what's called a bound method - it remembers the instance it was taken from so that its self attribute gets automatically populated by that instance.

You can easily check a difference between a class function (unbound method) and an instance method (bound method), Python will quite happily tell you all the details:

testObject = Test()

print(Test.checkIsA)        # <function Test.checkIsA at 0x00000000041236A8>
print(testObject.checkIsA)  # <bound method Test.checkIsA of
                            # <__main__.Test object at 0x0000000004109390>>

You can simulate a call to testObject.checkIsA() directly through the unbound Test.checkIsA function by passing your instance, too, e.g.:

def tester(func, instance, item):
    return func(instance, item)

testObject = Test()
print(tester(Test.checkIsA, testObject, 'a'))  # prints True

Or, with functools.partial:

import functools

def tester(func, item):
    return func(item)

testObject = Test()
print(tester(functools.partial(Test.checkIsA, testObject), 'a'))  # prints True

And that's exactly what a bound instance method does for you in the back by supplementing the first self attribute with its stored __self__ value. You can check that, too:

testObject = Test()
print(testObject.checkIsA.__self__ is testObject)  # True

Upvotes: 1

Related Questions