最终编辑
我的问题是我试图将部分绑定到类。不知道我应该删除此问题还是更改其标题。
原始问题
我知道将方法绑定到其元类内部的类的“正确”方法是将其添加到classdict
元类__new__
方法的参数中,并且通常,您可以通过简单地将实例方法分配给类来将实例方法绑定至类。
但是,在我的用例中,我需要在元类的__init__
方法期间将方法绑定到类。问题是通常的分配方法不起作用。该函数已分配给该类,可以通过ClassName.function_name
或进行访问class_instance.function_name
,但未绑定到该类,并且第一个参数未设置为self
。
我猜这是由于该类在metaclass期间没有完全初始化而导致的__init__
,但是有什么办法可以解决此问题呢?
编辑:代码示例
鉴于:
def fun(self):
pass
class MetaClass(type):
def __init__(cls, name, bases, dct):
pass
class Class(object):
__metaclass__ = MetaClass
我想绑定fun
到Class
里面MetaClass.__init__
,这样打电话
instance = Class()
instance.fun()
将作为第一个参数传递instance
给fun
。
编辑II
因此,显然是因为我试图绑定部分而出现了问题。不知道为什么会引起问题。
请稍后再确认,并在必要时更新/删除此问题。
metaclass.__new__()
和之间几乎没有区别metaclass.__init__()
;他们都处理类对象。
__new__
产生新对象,__init__
然后仍然对其进行更改。事件链基本上是:
new_class_obj = YourMeta.__new__(YourMeta, name, bases, bodydict)
YourMeta.__init__(new_class_obj, name, bases, bodydict)
在新类对象上添加功能时(通过bodydict
或直接通过在类对象上分配),根本没有区别。
如果在类对象上设置函数时遇到问题,则需要确保在该对象上设置实际的函数对象。
例如,如果您使用绑定方法,则需要解开方法并仅提取函数:
new_class_obj.name = method_obj.__func__
如果要在类上添加常规函数对象,则在实例上访问它们时将对其进行绑定,而无需进行任何工作。
最重要的是,您需要添加一些将充当描述符的内容,特别是要从该descriptor.__get__
方法返回方法对象的描述符。这就是普通函数对象所做的。
甲functools.partial()
对象是不是这样的描述符。最简单的方法是将partial包装在一个函数中(alambda
将在此处完成):
new_class_obj.name = lambda *args, **kw: partial_obj(*args, **kw)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句