Как установить собственный аргумент в декоратор? - PullRequest
0 голосов
/ 06 сентября 2018

Может кто-нибудь мне помочь? У меня есть что-то вроде:

class MyClass:
    def __init__(self, *, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

    @test_dec('some param', self.arg2)
    def test_func():


        pass

Но это не работает. Итак, как я могу поставить self.arg2 на test_dec?

Я хочу сделать что-то вроде:

import socketio
sio = socketio.AsyncServer()

class MyClass: 
    def __init__(self, options): 
        self.options = options 

    @sio.on('connect', namespace=self.options['namespace']) 
    def func(): pass

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вы можете получить доступ к arg2 в декораторе по ссылке на self:

def test_dec(param):
  def outer(f):
    def wrapper(_self):
      _val = _self.arg2
      #do something
    return wrapper
  return outer

class MyClass:
  def __init__(self, *, arg1, arg2):
    self.arg1 = arg1
    self.arg2 = arg2
  @test_dec('some param')
  def test_func(self):
    pass
0 голосов
/ 06 сентября 2018

Сначала, когда ничего нет, нет self. если вы хотите сделать это, вы должны сделать что-то вроде этого:

class MyClass:
    arg = 'something'       

    def __init__(self, *, arg1, arg2):
        self.arg1 = arg1
        self.arg = arg2

    @test_dec('some param', arg)
    def test_func():
        pass

Но значение после инициации класса не действует на декоратор. Вы должны украсить свой класс этим arg.


или, как сказал Аран-Фей, проверьте ссылку , это поможет вам украсить свой класс.

...