python - python 中的方法与类相关联。与实例直接关联的函数意味着什么?
问题描述
我知道在python中,方法与类而不是实例相关联,但它们接受实例作为它们的第一个参数以便访问它。但是,仍然可以定义一个函数并将其直接绑定到一个实例。这意味着什么?这个函数可以以某种方式访问实例吗?
class TestClass:
def __init__(self, a):
self.a = a
def method1(self):
return self.a
my_obj = TestClass(12)
print(my_obj.method1()) // 12
Python 也允许这样做:
class TestClass:
def __init__(self, a):
self.a = a
my_obj = TestClass(12)
def method1_defined_outside(self):
return self.a
TestClass.method1 = method1_defined_outside
print(my_obj.method1()) // 12
上面两个片段的意思是一样的。但python也允许这样做:
class TestCase:
def __init__(self, a):
self.a = a
my_obj = TestCase(12)
def method1_defined_outside(self):
return self.a
my_obj.method1 = method1_defined_outside
print(my_obj.method1()) // this throws an error stating the method1 is missing one postional argument(s), so clearly self does not automatically equate to the object
第二个和第三个片段之间的区别在于,外部定义的方法与后者中的实例相关联,而与前者中的类相关联。
解决方案
当您通过实例访问方法,但该方法存在于类上时,访问该方法实际上会创建一个方法包装器。这个包装器知道调用该方法的实例,并将其作为第一个参数(按照约定命名为self
)传递给实际函数。这背后的机制是描述符协议,它也是属性的工作方式。
当您将方法直接放在实例上时,这些都不适用,它只是您通过实例访问的函数。它没有得到self
。
现在,您可以通过手动调用描述符来创建方法包装器,并在实例上设置生成的绑定方法。
my_obj.method1 = method1_defined_outside.__get__(my_obj)
现在my_obj.method1()
传递my_obj
为self
.
但是,您希望在这样的实例上设置方法的情况相当罕见。
推荐阅读
- django - 每次我尝试从 django admin 上传图像时,我都会收到此错误:“FOREIGN KEY 约束失败”
- python - 为什么“pip install”命令没有被 docker 缓存?
- markdown - 我可以使用 vuepress 和 vuepress-theme-hope 来做一些这样的事情吗?
- c# - 基于任务的异步模式 (TAP) 和任务并行 (TPL) 与任务(或任务),线程可以做什么
) 无法做到? - c# - Unity3D - 错误:无法在 AndroidManifest.xml 文件中指定 minSdk 版本。你必须删除它
- python - 尝试使用 MinMaxScaler 缩放变量时的 SettingWithCopyWarning
- command-prompt - 命令提示符损坏
- xml - 在电子书文件中制作表格
- reactjs - Onesignal 命中通知客户门户到管理门户
- google-apps-script - CURL XHR Google App Script - 我想不通