(澳门银河官网) Python3 一个类中存在大量结构接近的方法,能否用修饰器来避免大量代方法的机械性的改写?
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网

(澳门银河官网) Python3 一个类中存在大量结构接近的方法,能否用修饰器来避免大量代方法的机械性的改写?

class Classnameobject:
    def __init__self, p1, p2=:
        self.p1 = p1
        self.p2 = p2

    # @Classname.decorator
    def method_oneself, p_list:
        return function_onep_list

    def method_oneself, p_list:
        return function_twop_list

    def method_oneself, p_list:
        return function_threep_list

其中大量都是这样的method_one调用funciton_one,但是现在要根据用户是否传入p2来改变调用function_xxx的方法,希望改成这个样子
function_xxx的代码我无法修改.

    def method_twoself, p_list:
        if self.p2:
            return function_twoself.p2, p_list
        else:
            return function_twop_list

考虑过使用修饰器来处理,但是使用修饰器来处理话似乎只能在函数外面包一层,而无法侵入性的改变调用方法,请问此处有什么合适的解决方法吗?
如果以后还可能根据self.p3 self.p4来修改调用方法,有什么更好的解决方法吗?

你可以使用元类魔改类,这里放出个例子

def function_one*args:
    print1, args

def function_two*args:
    print2, args

def make_methodfunc:
    # 此处填逻辑
    def _methodself, plist:
        funcplist
        
    return _method

# 元类工厂方法,传入包含 function_xxx 的模块对象
def metamod:
    class Metatype:
        def __new__cls, name, bases, attrs:
            fnames = attrs.getFUNCTIONS, []
            for n in fnames:
                func = getattrmod, function_ + n
                attrs[method_+n] = make_methodfunc
            return superMeta, cls.__new__cls, name, bases, attrs
    return Meta

import sys

myself = sys.modules[__name__]

class Classmetaclass=metamyself: 
    FUNCTIONS = [one, two]

obj = Class
obj.method_oneone
obj.method_twotwo

栏目列表

广告位

澳门银河官网