函数指针中的自属性?

2024-10-01 17:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个简单的python3类,如下所示:

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

以及一些进一步的代码,例如:

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

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

当被另一个函数独立使用时,函数指针(?)checkIsA如何仍然知道它的类成员变量(由self定义)

我想在我正在编写的程序中使用这个功能,但我担心我没有正确理解这些语义


Tags: 代码testselfreturninitdefitempython3
1条回答
网友
1楼 · 发布于 2024-10-01 17:32:02

testObject.checkIsA是所谓的绑定方法-它记住从中获取的实例,以便其self属性由该实例自动填充

您可以轻松地检查类函数(未绑定方法)和实例方法(绑定方法)之间的差异,Python将非常高兴地告诉您所有细节:

testObject = Test()

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

您也可以通过传递实例,直接通过unbound Test.checkIsA函数模拟对testObject.checkIsA()的调用,例如:

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

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

或者,使用functools.partial

import functools

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

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

这正是绑定实例方法在后面为您所做的,它使用存储的__self__值补充第一个self属性。您也可以检查:

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

相关问题 更多 >

    热门问题