我是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/