最终编辑
我的问题是我试图将一个部分绑定(bind)到一个类。不确定我是否应该删除此问题或更改其标题。
原始问题
我知道the "correct" way将方法绑定(bind)到其元类中的类是将其添加到元类的 __new__
方法中的 classdict
参数,通常您可以将实例方法绑定(bind)到类只需将其分配给类(class)即可。
但是,在我的用例中,我需要在元类的 __init__
方法期间将方法绑定(bind)到类。问题是通常的分配方法不起作用。该函数被分配给类,可以通过 ClassName.function_name
或 class_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/