Il existe un grand nombre de méthodes avec des structures similaires dans une classe Python3. Des modificateurs peuvent-ils être utilisés pour éviter la réécriture mécanique d'un grand nombre de méthodes de génération ?
PHPz
PHPz 2017-05-24 11:35:25
0
1
873
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)

Une grande partie du code est comme çamethod_one调用funciton_one,但是现在要根据用户是否传入p2来改变调用function_xxx的方法,希望改成这个样子
function_xxxJe ne peux pas le modifier.

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

J'ai envisagé d'utiliser un décorateur pour le gérer, mais il semble que l'utilisation d'un décorateur ne puisse envelopper qu'un calque en dehors de la fonction, mais ne puisse pas modifier de manière intrusive la méthode d'appel ici
Si vous en avez toujours besoin dans le fichier ? futur Il est possible de modifier la méthode d'appel basée sur self.p3 self.p4 Existe-t-il une meilleure solution ?

PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
滿天的星座

Vous pouvez utiliser des métaclasses pour modifier les classes comme par magie, voici un exemple

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')
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!