python-3.x - 将函数动态添加到类并使其成为绑定(bind)方法

标签 python-3.x

我是python新手。我想为这个类编写一个 add_function 方法来动态地将任何函数添加到我的类中。这个函数可以操作我的类的一些属性,但它是在类之外编写的。假设这个类及其方法。

import numpy as np
import feature_function as ffun



class Features:
    
    def __init__(self,x,fs=None):
        self.x = x
        self.fs = fs

        self.label = []
        self.features = []

    def __mean(self, nan_omit = False, min_samples = 1):
        out = ffun.mean(self.x, nan_omit = nan_omit, min_samples = min_samples)
        self.label.extend(['mean'])
        self.features = np.append(self.features,out)

现在我想在类的范围之外编写这个函数:
def __max(self, nan_omit = False, min_samples = 1):
    out = ffun.max(self.x, nan_omit = nan_omit, min_samples = min_samples)
    self.label.extend(['max'])
    self.features = np.append(self.features,out)
并将其添加到类中。为了向类中添加函数,我在类中有一个 add_function 方法,它的参数是在类外部传递的函数以及函数的名称。

    # Add function dynamically by user
    def add_function(self, name, methodToRun, type ):
        name2 = '__' + name
        # setattr(self, name2, methodToRun)
        setattr(self, mangle_attr(self, name2), methodToRun)

mangle_attr是一个函数,用于将私有(private)函数设置为类。
def mangle_attr(source, attr):
    # if source is an object, get the class
    if not hasattr(source, "__bases__"):
        source = source.__class__
    # mangle attr
    tmp = {}
    code = _mangle_template.format(cls=source.__name__, attr=attr)
    eval(compile(code, '', 'exec'), {}, tmp); 
    return tmp['cls'].mangle.__code__.co_varnames[0]

使用 setattr不绑定(bind) __max对我的类(class)起作用,例如 __mean在我的类(class)中有界,如果我调用我可以看到的函数:<bound method Features.__mean of <__main__.Features object at 0x7fd4c91aac10>>但是对于 __max我仍然看到这个:<function skewness at 0x7fd2b9dbfb90>我有解决这个问题的方法吗?

最佳答案

您的 addfunction将其参数绑定(bind)到实例 self ,不上课。将参数绑定(bind)到类,例如通过 type(self)classmethod :

class Features:
    ...
    # Add function dynamically by user
    @classmethod
    def add_function(cls, name, methodToRun, type ):
        name2 = '__' + name
        setattr(cls, mangle_attr(self, name2), methodToRun)
绑定(bind)方法是类上的一个函数,通过实例查找。向实例添加函数只是使其成为一个属性,而该属性恰好是可调用的。

关于python-3.x - 将函数动态添加到类并使其成为绑定(bind)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63550773/

相关文章:

python-3.x - 有没有办法将一对多关系中的sqlite列中的值聚合到数组中?

python - 两个列表的所有可能替换?

python - python 3中的发电机速度

python-3.x - Python 3 将 ISO 8601 转换为毫秒

python - 在python中使用相同签名的方法重载

python - 从 google.cloud 导入 firestore ModuleNotFoundError : No module named 'google'

Python 列表到 Pandas 数据框的字典

python - tensorflow - tf.confusion_matrix() 抛出错误 ValueError : Shape (2, 2048, 2) 必须具有等级 2

python - 打印列表返回每个元素的位置,而不是值

python-3.x - pyqt5和多重继承