在python中将方法动态绑定到类实例

2024-06-23 02:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在moduleA.py中定义了一个类,我想向该类添加一个方法,使用某种类型的加载程序方法,该加载程序方法接受第二个模块的名称,并且在那里定义的方法应该被绑定

class ClassA(object):
    def __init__(self,config):
        super(ClassA, self).__init__()

        self.a = 1
        self.b = 2
        self.meth1 = self. bind_method(config)

    def bind_method(self,config):
        # load method
        <return method defined in config as a str 'moduleB.meth2'>

    def calling_method():
        return self.meth1() 

其中,moduleB.py中定义的方法类似于:

def meth2(self):
    return self.a + self.b

关键是我希望能够编写meth2,以便在绑定后能够访问ClassA的类变量。这样,当你想要像这样的东西时:

from moduleA import ClassA

A = ClassA()
aout = A.calling_method()

调用A.calling_method()正确地调用moduleB.py中定义的方法。

在使用types.MethodType实例化ClassA之后,我已经在上的答案中看到了这种绑定,但是我还不能挖掘如何在类定义中绑定,以便在类被实例化时在内部完成绑定。

关于bind_method方法中应该做什么的任何建议都将非常感谢。


Tags: 方法pyself程序configreturn定义bind
3条回答

跳过我不清楚的配置内容,绑定本身如下所示:

from moduleB import meth2
ClassA.meth1 = meth2

重要的是,您绑定到类,而不是实例。这样,如果对实例调用meth1,它将自动接收实例作为第一个参数。

import sys
import types

def getobj(astr):
    """
    getobj('scipy.stats.stats') returns the associated module
    getobj('scipy.stats.stats.chisquare') returns the associated function
    """
    try:
        return globals()[astr]
    except KeyError:
        try:
            return __import__(astr, fromlist=[''])
        except ImportError:
            modname, _, basename = astr.rpartition('.')
            if modname:
                mod = getobj(modname)
                return getattr(mod, basename)
            else:
                raise

class ClassA(object):
    def __init__(self, methpath):
        super(ClassA, self).__init__()
        self.a = 1
        self.b = 2
        self.meth1 = types.MethodType(getobj(methpath), self)

a = ClassA('moduleB.meth2')
print(a.meth1())
# 3

因为meth2()是一个函数,所以它是一个描述符,您可以通过调用uuGet_uuu()方法来绑定它。

def meth2(self):
    return self.a + self.b

class ClassA(object):
    def __init__(self,config):
        super(ClassA, self).__init__()
        self.a = 1
        self.b = 2
        self.meth1 = config.__get__(self, ClassA)

c = ClassA(meth2)
print c.meth1() #correctly prints 3 

相关问题 更多 >