将对象方法作为 lambda 或部分函数传递,用目标对象替换 self 参数?
Pass object method as lambda or partial function, replacing self parameter with target object?
用例: 假设我有一组非常大的 Pandas 系列对象,我希望将 .drop_na()
方法应用于所有他们。但是,因为它们太大了,我必须使用一个函数来执行此操作 multiprocessing
,方法是接受对象列表并将列表中的每个对象用作方法的参数(也作为对象传递) .
假定对象方法的第一个隐式参数是 self。
我可以使用 lambda、partial 或其他技巧来传递 .drop_na()
方法并将 .drop_na()
中的 self 参数替换为系列的特定实例吗?这在 Python 中可行吗?
是的。当使用 .
表示法绑定到作为 class 实例的对象时,第一个参数仅为 "implicit",例如
sr = Series(...)
sr.drop_na()
在这种情况下,sr.drop_na
实际上是一个闭包,它将Series.drop_na
的self
参数替换为对sr
的引用,有点像
lambda: Series.drop_na(sr)
您始终可以直接从 class 调用方法并显式传递 self
参数。上面的例子可以改写为:
sr = Series(...)
Series.drop_na(sr)
您可以根据需要传递函数 Series.drop_na
并在您需要的任何对象上调用它。请注意 Series.drop_na
采用单个参数,而 sr.drop_na
不采用。
这不是诡计,实际上是语言的一种深思熟虑的设计选择,旨在用于与您的情况(以及许多其他情况)一样的情况。
用例: 假设我有一组非常大的 Pandas 系列对象,我希望将 .drop_na()
方法应用于所有他们。但是,因为它们太大了,我必须使用一个函数来执行此操作 multiprocessing
,方法是接受对象列表并将列表中的每个对象用作方法的参数(也作为对象传递) .
假定对象方法的第一个隐式参数是 self。
我可以使用 lambda、partial 或其他技巧来传递 .drop_na()
方法并将 .drop_na()
中的 self 参数替换为系列的特定实例吗?这在 Python 中可行吗?
是的。当使用 .
表示法绑定到作为 class 实例的对象时,第一个参数仅为 "implicit",例如
sr = Series(...)
sr.drop_na()
在这种情况下,sr.drop_na
实际上是一个闭包,它将Series.drop_na
的self
参数替换为对sr
的引用,有点像
lambda: Series.drop_na(sr)
您始终可以直接从 class 调用方法并显式传递 self
参数。上面的例子可以改写为:
sr = Series(...)
Series.drop_na(sr)
您可以根据需要传递函数 Series.drop_na
并在您需要的任何对象上调用它。请注意 Series.drop_na
采用单个参数,而 sr.drop_na
不采用。
这不是诡计,实际上是语言的一种深思熟虑的设计选择,旨在用于与您的情况(以及许多其他情况)一样的情况。