Однако у меня есть три проблемы:
- Я создаю 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__() или это нормально, поскольку он просто возвращает функцию?
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
Мобильная версия