#python #nxt
#python #nxt
Вопрос:
Я помогаю поддерживать пакет для python под названием nxt-python. Он использует метаклассы для определения методов объекта управления. Вот метод, который определяет доступные функции:
class _Meta(type):
'Metaclass which adds one method for each telegram opcode'
def __init__(cls, name, bases, dict):
super(_Meta, cls).__init__(name, bases, dict)
for opcode in OPCODES:
poll_func, parse_func = OPCODES[opcode]
m = _make_poller(opcode, poll_func, parse_func)
setattr(cls, poll_func.__name__, m)
Я хочу иметь возможность добавлять разные строки документа к каждому из этих методов, которые он добавляет. m — это метод, возвращаемый _make_poller(). Есть идеи? Есть ли какой-нибудь способ обойти ограничение python на изменение строк документа?
Комментарии:
1. Вы также можете передать ее в свой
_Meta
конструктор вdict
аргументе как_Meta(cls,name,bases,dict={'__doc__':"""docstring"""})
или calldict.update({'__doc__':"""docstring"""})
перед вашимsuper
вызовом. Теперь у вас есть как минимум 4 варианта.
Ответ №1:
Для простых функций:
def f(): # for demonstration
pass
f.__doc__ = "Docstring!"
help(f)
Это работает как в python2, так и в python3, для функций с определенными строками документа и без них. Вы также можете сделать =
. Обратите внимание, что это __doc__
и не __docs__
.
Для методов необходимо использовать __func__
атрибут метода:
class MyClass(object):
def myMethod(self):
pass
MyClass.myMethod.__func__.__doc__ = "A really cool method"
Комментарии:
1. Я попробовал это в методе класса и получил ошибку. Оказывается, что для метода класса, который, я думаю, является тем, чего хочет исходный вопрос, вы хотели бы выполнить: self.method.__func__.__doc__
Ответ №2:
Вы также можете использовать setattr для объекта класса / функции и задать строку документа.
setattr(foo,'__doc__',"""My Doc string""")