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 定义)?
我想在我正在编写的程序中使用这个功能,但我担心我没有正确理解这些语义。
解决方案
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>>
您也可以通过传递您的实例来模拟testObject.checkIsA()
直接通过未绑定Test.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
推荐阅读
- ios - TinyMCE 图像上传在 iOS (Safari) 上不起作用
- ios - 无法在 Xcode 调试器中按名称解析枚举值
- javascript - 将 Excel 表上传到 Wordpress phpmyadmin 数据库
- ruby - 无法使用 bundle 安装 gem
- entity-framework - 在 ASP.NET Core Web API 中实现过滤的最佳方法是什么?
- android - 在android应用程序中,我使用蜂窝网络的ip创建套接字它可以工作,但是当我使用wifi路由器时,ip是本地的,如192.168.23.2
- vulkan - 什么是 vulkan 中的“Push-Constant”?
- python-3.x - 使用 pip 安装 requirements.txt 文件时出现 TLS/SSL 问题
- sql - 使用 CROSS APPLY 的 SQL Server 查询包括没有 CROSS APPLied 表的行
- shell - 模式匹配“hdfs ds -ls”输出时如何忽略时间戳?