Python的装饰把实例初始化变量为自我属性

问题描述 投票:-1回答:3

我什么地方看到过的代码变成:

@some_decorator
def __init__(args):

成:

self.arg1 = arg1
self.arg2 = arg2

自动。我忘了如何做到这一点。什么是代码?

python
3个回答
1
投票

还有你说argskwargs,所以这里有云:

def dec(f):
    def wrapper(*args):
        self = args[0]
        for i, v in enumerate(args[1:], 1):
            self.__dict__[f'arg{i}'] = v
        return f(*args)
    return wrapper

class MyC:
    @dec
    def __init__(self,*args):
        print(self.__dict__)

MyC(1,2,3)

打印:

{'arg1': 1, 'arg2': 2, 'arg3': 3}

0
投票

即完成你的要求会看人生下面什么装饰器:

from functools import wraps
def init_kwargs(f):
     @wraps(f)                                                                       
     def wrapper(self, *args, **kwargs):
         self.__dict__.update(kwargs)
         return f(self, *args)
     return wrapper

并且可以使用像这样:

class TestCase:
     @init_kwargs                                                                            
     def __init__(self):                                         
         pass

t = TestCase(argument_one="fun", argument_two="thing")
assert t.argument_one == 'fun'                                                                          
assert t.argument_two == 'thing'

0
投票

您可以指定__dict__用在装饰所产生的值的字典:

def initialize(f):
  def _wrapper(_self, *args):
    _self.__dict__ = {f'arg{i}':a for i, a in enumerate(args, 1)}
    return f(_self, *args)
  return _wrapper

class Test:
   @initialize
   def __init__(self, *args):
      print(self.__dict__)

t = Test(1, 2, 3, 4)

输出:

{'arg1': 1, 'arg2': 2, 'arg3': 3, 'arg4': 4}

然而,它是非常清洁的使用setattr

def initialize(f):
  def _wrapper(_self, *args): 
    for i, a in enumerate(args, 1):
      setattr(_self, f'arg{i}', a)
    return f(_self, *args)
  return _wrapper

class Test:
  @initialize
  def __init__(self, *args):
    print(self.__dict__)

t = Test(1, 2, 3, 4)

输出:

{'arg1': 1, 'arg2': 2, 'arg3': 3, 'arg4': 4}
© www.soinside.com 2019 - 2024. All rights reserved.