Dynamically bind method to class instance in python

前端 未结 4 1089
野性不改
野性不改 2021-01-06 00:52

Let\'s say that I have a class defined in moduleA.py which I want to add a method to, using some sort of loader method that takes a the name of a second module

4条回答
  •  耶瑟儿~
    2021-01-06 01:12

    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
    

提交回复
热议问题