自属性存在于函数指针中?
Self Attributes Live in Function Pointer?
假设我有一个简单的 python3 class 像这样:
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 在被另一个函数独立使用时如何仍然知道它的 class 成员变量(由自己定义)?
我想在我正在编写的程序中使用此功能,但我担心我没有正确理解这些语义。
testObject.checkIsA
就是所谓的绑定方法 - 它会记住从中获取的实例,因此它的 self
属性会由该实例自动填充。
您可以轻松检查 class 函数(未绑定方法)和实例方法(绑定方法)之间的区别,Python 会很乐意告诉您所有细节:
testObject = Test()
print(Test.checkIsA) # <function Test.checkIsA at 0x00000000041236A8>
print(testObject.checkIsA) # <bound method Test.checkIsA of
# <__main__.Test object at 0x0000000004109390>>
您也可以通过未绑定的 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
假设我有一个简单的 python3 class 像这样:
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 在被另一个函数独立使用时如何仍然知道它的 class 成员变量(由自己定义)?
我想在我正在编写的程序中使用此功能,但我担心我没有正确理解这些语义。
testObject.checkIsA
就是所谓的绑定方法 - 它会记住从中获取的实例,因此它的 self
属性会由该实例自动填充。
您可以轻松检查 class 函数(未绑定方法)和实例方法(绑定方法)之间的区别,Python 会很乐意告诉您所有细节:
testObject = Test()
print(Test.checkIsA) # <function Test.checkIsA at 0x00000000041236A8>
print(testObject.checkIsA) # <bound method Test.checkIsA of
# <__main__.Test object at 0x0000000004109390>>
您也可以通过未绑定的 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