python - 如何在其元类的 __init__ 方法期间将方法绑定(bind)到类?

标签 python

最终编辑

我的问题是我试图将一个部分绑定(bind)到一个类。不确定我是否应该删除此问题或更改其标题。

原始问题

我知道the "correct" way将方法绑定(bind)到其元类中的类是将其添加到元类的 __new__ 方法中的 classdict 参数,通常您可以将实例方法绑定(bind)到类只需将其分配给类(class)即可。

但是,在我的用例中,我需要在元类的 __init__ 方法期间将方法绑定(bind)到类。问题是通常的分配方法不起作用。该函数被分配给类,可以通过 ClassName.function_nameclass_instance.function_name 访问,但它没有绑定(bind)到类,第一个参数不是设置为 self

我猜这是因为类在元类 __init__ 期间没有完全初始化,但是有什么办法可以解决这个问题吗?

编辑:代码示例

给定:

def fun(self):
    pass


class MetaClass(type):
    def __init__(cls, name, bases, dct):
        pass

class Class(object):
    __metaclass__ = MetaClass

我想将 fun 绑定(bind)到 MetaClass.__init__ 中的 Class,以便调用

instance = Class()
instance.fun()

会将 instance 作为第一个参数传递给 fun

编辑 II

所以,显然问题出现是因为我试图绑定(bind)一个部分。不确定为什么会导致问题。

稍后会确定,并在必要时更新/删除此问题。

最佳答案

metaclass.__new__()metaclass.__init__() 没有什么区别;它们都处理类对象。

__new__ 生成新对象,__init__ 然后继续修改它。事件链基本上是:

new_class_obj = YourMeta.__new__(YourMeta, name, bases, bodydict)
YourMeta.__init__(new_class_obj, name, bases, bodydict)

在新类对象上添加函数时(通过 bodydict 或直接在类对象上赋值)没有任何区别。

如果您在类对象上设置函数时遇到问题,那么您需要确保在该对象上设置实际的函数对象。

例如,如果您正在使用绑定(bind)方法,则需要解包该方法并仅提取函数:

new_class_obj.name = method_obj.__func__

如果您要在类上添加常规函数对象,那么在访问实例时它们将被绑定(bind),您不需要做任何工作。

最重要的是,您需要添加一些东西来充当descriptor。 ,特别是将从 descriptor.__get__ 方法返回方法对象的描述符。这就是普通函数对象所做的。

functools.partial() 对象不是这样的描述符。最简单的方法是将部分包装在一个函数中(lambda 将在此处执行):

new_class_obj.name = lambda *args, **kw: partial_obj(*args, **kw)

关于python - 如何在其元类的 __init__ 方法期间将方法绑定(bind)到类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072576/

相关文章:

python - NDB 按 DateTimeProperty 的时间部分查询

python - Matplotlib 自定义颜色图不尊重着色

python - django.setup() 的目的是什么?

python - 使用条件更改列值或附加新行的数据框更新 SQLite DB

python - 矢量模块中的点积

python - 如何产生指数比例轴?

使用文件处理程序的 Python 正确日志记录

python - 设置索引列的所有列的每行之间的差异

python - 在 Python 中使用客户端子网选项解析 dns (edns)

python - 运行子文件夹中的脚本