Проблемы с передачей себя декоратору классаPython

Программы на Python
Ответить
Anonymous
 Проблемы с передачей себя декоратору класса

Сообщение Anonymous »

Я хочу использовать декораторы, чтобы просто определить набор функций класса внутри класса OptionClass, каждая из которых представляет определенный параметр с именем и описанием, а также, если он необходим. Я вообще не хочу изменять работу функции класса, если это имеет смысл, я хочу использовать декоратор только для определения имени, описания и необходимости этого.
Однако у меня есть три проблемы:
  • Я создаю OptionClass() и хочу вызвать его option_1. Когда я это делаю, я получаю TypeError, поскольку декоратор __call__ не получает экземпляр OptionClass. Почему это? Когда я вызываю option_1, передавая экземпляр OptionClass(), это работает. Как мне вызвать option_1 без необходимости всегда передавать экземпляр как собственный?
    При получении возникает следующая ошибка:
    Traceback (most recent call last):
    File "D:/OneDrive_P/OneDrive/projects/python/examples/dec_ex.py", line 110, in
    print(a.option_1("test")) # TypeError: option1() missing 1 required positional argument: 'test_text'
    File "D:/OneDrive_P/OneDrive/projects/python/examples/dec_ex.py", line 80, in __call__
    return self.function_ptr(*args, **kwargs)
    TypeError: option_1() missing 1 required positional argument: 'test_text'
  • Как мне запустить или вызвать методы декоратора для set_name, set_description, set_required?
  • Хотя это пример, я собираюсь закодировать класс опций с использованием асинхронных функций и украсить их. Нужно ли мне сделать декоратор __call__ асинхронным по __call__() или это нормально, поскольку он просто возвращает функцию?
class option_decorator(object):
def __init__(self, function_pt):
self.function_ptr = function_pt
self.__required = True
self.__name = ""
self.__description = ""

def set_name(self, text):
self.__name = text

def set_description(self, text):
self.__description = text

def set_required(self,flag:bool):
self.__required = flag

def __bool__(self):
"""returns if required"""
return self.__required

def __call__(self, *args, **kwargs):
return self.function_ptr(*args, **kwargs)

def __str__(self):
"""prints a description and name of the option """
return "{} - {}".format(self.__name, self.__description)

class OptionClass(object):
"""defines a bunch of options"""
@option_decorator
def option_1(self,test_text):
return("option {}".format(test_text))

@option_decorator
def option_2(self):
print("option 2")

def get_all_required(self):
"""would return a list of option functions within the class that have their decorator required flag set to true"""
pass

def get_all_available(self):
"""would return all options regardless of required flag set"""
pass

def print_all_functions(self):
"""would call str(option_1) and print {} - {} for example"""
pass

a = OptionClass()
print(a.option_1("test")) # TypeError: option1() missing 1 required positional argument: 'test_text'
print(a.option_1(a,"test")) #Prints: option test


Подробнее здесь: https://stackoverflow.com/questions/510 ... -decorator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»