cari

Rumah  >  Soal Jawab  >  teks badan

Terdapat sejumlah besar kaedah dengan struktur serupa dalam kelas Python3 Bolehkah pengubah suai digunakan untuk mengelakkan penulisan semula mekanikal bagi sejumlah besar kaedah penjanaan?

class Classname(object):
    def __init__(self, p1, p2=''):
        self.p1 = p1
        self.p2 = p2

    # @Classname.decorator
    def method_one(self, p_list):
        return function_one(p_list)

    def method_one(self, p_list):
        return function_two(p_list)

    def method_one(self, p_list):
        return function_three(p_list)

Banyak kod seperti inimethod_one调用funciton_one,但是现在要根据用户是否传入p2来改变调用function_xxx的方法,希望改成这个样子
function_xxxSaya tidak boleh mengubah suainya.

    def method_two(self, p_list):
        if self.p2:
            return function_two(self.p2, p_list)
        else:
            return function_two(p_list)

Saya telah mempertimbangkan untuk menggunakan penghias untuk mengendalikannya, tetapi nampaknya menggunakan penghias hanya boleh membungkus lapisan di sekeliling fungsi, dan tidak boleh mengubah kaedah panggilan secara mengganggu
Jika saya masih perlu melakukannya pada masa hadapan, Adalah mungkin untuk mengubah suai kaedah panggilan berdasarkan self.p3 self.p4 Adakah terdapat penyelesaian yang lebih baik?

PHPzPHPz2783 hari yang lalu909

membalas semua(1)saya akan balas

  • 滿天的星座

    滿天的星座2017-05-24 11:37:25

    Anda boleh menggunakan metaclass untuk mengubah suai kelas secara ajaib, berikut ialah contoh

    def function_one(*args):
        print(1, args)
    
    def function_two(*args):
        print(2, args)
    
    def make_method(func):
        # 此处填逻辑
        def _method(self, plist):
            func(plist)
            
        return _method
    
    # 元类工厂方法,传入包含 function_xxx 的模块对象
    def meta(mod):
        class Meta(type):
            def __new__(cls, name, bases, attrs):
                fnames = attrs.get('FUNCTIONS', [])
                for n in fnames:
                    func = getattr(mod, 'function_' + n)
                    attrs['method_'+n] = make_method(func)
                return super(Meta, cls).__new__(cls, name, bases, attrs)
        return Meta
    
    import sys
    
    myself = sys.modules[__name__]
    
    class Class(metaclass=meta(myself)): 
        FUNCTIONS = ['one', 'two']
    
    obj = Class()
    obj.method_one('one')
    obj.method_two('two')

    balas
    0
  • Batalbalas