如何在其元类的__init__方法期间将方法绑定到类?

罗曼·莱文

最终编辑

我的问题是我试图将部分绑定到类。不知道我应该删除此问题还是更改其标题。

原始问题

我知道将方法绑定到其元类内部的类的“正确”方法是将其添加到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

我想绑定funClass里面MetaClass.__init__,这样打电话

instance = Class()
instance.fun()

作为第一个参数传递instancefun

编辑II

因此,显然是因为我试图绑定部分而出现了问题。不知道为什么会引起问题。

请稍后再确认,并在必要时更新/删除此问题。

马丁·彼得斯(Martijn Pieters)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在其他函数中使用函数中的变量而不将变量放入类的 __init__ 方法中?

python类的__init__方法

如何将WPF控件绑定到类方法的结果?

将类方法绑定到线程

如何测试一个在其 __init__ 中创建到数据库的连接的类?

如果在类的 __init__ 方法之外没有在其他地方使用参数,如何使用参数?

如何在实例化对象时传递 **kwargs 并在类的 __init__() 方法中访问它

如何在不同类 __init__ 中的实例上调用类方法

如何从子类中调用基类的__init__方法?

如何在自定义 python 日志记录类中将变量动态传递给类 __init__ 方法

在类方法中访问__init__ vars

模拟父类__init__方法

从__init__调用类方法而不重复类名

在Python中动态创建类后如何调用父类的__init__方法?

在基类__init__的子类__init__之后调用基类方法吗?

将方法绑定到另一个类

如何在不静态的情况下将回调绑定到类方法?

静态方法如何不绑定到“ staticmethod”类?

如何从父类继承__init__属性到子类的__init__?

将字典参数发送到 __init__ 内部调用的类方法

将super与Django ModelForm类结合使用以更改__init__方法

如何在__init__之前向类添加属性?

如何在类的__init__函数中使用canvas参数?

如何将参数传递给类中的__init__

如何在包含此方法的类之外将方法订阅到按钮触摸中?

用python中的父类方法重写__init__

从父类扩展python 3中的__init__的正确方法

使用__init__中的参数定义python类方法

如果定义没有__init__方法的类会怎样?