Python: make function to be a bounded method

 

 所有function都有 __get__ 用于实现绑定

 

 

 

__get__

复制代码
class B:
    def __init__(self, v):
        self._v = v

    def v(self):
        return self._v


def bind(instance, func, name=None):
    if name is None:
        name = func.__name__
    bounded = func.__get__(instance, instance.__class__)
    setattr(instance, name, bounded)
    return bounded


def double(self):
    return 2 * self._v


print(getattr(B.v, '__get__'))
print(B.v)

b = B(55)
print(bind(b, double))
print(b.double())

f = B.v.__get__(b, int)
print(f, b)
print(f())
print(f.__class__, )
复制代码

 

types.MethodType

复制代码
import types


def f(self):
    print(self)


class B:
    ...


method = types.MethodType(f, B())
print(method)
print(method())
复制代码

 

 

functools.partial

复制代码
import functools
import types


def f(self):
    print(self)


class B:
    ...


method = functools.partial(f, B())
print(method)
print(method())
复制代码

 

 

复制代码
import functools
import types


def f(self):
    print(self)


class B:
    ...


b = B()

b.method = (lambda self: lambda: f(self))(b)
print(b.method)
print(b.method())
复制代码

 

posted @   ascertain  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-09-12 命令分发器
2020-09-12 lru_cache的增强实现
点击右上角即可分享
微信分享提示