我使用描述符来定义接口类的寄存器:
class Register(object):
def __init__(self, address, docstring="instance docstring"):
self.address = address
self.__doc__ = docstring
def __get__(self, obj, objtype):
return obj.read(self.address)
def __set__(self, obj, val):
return obj.write(self.address, val)
class Interface(object):
r = Register(0x00, docstring="the first register")
我喜欢ipython的用户能够执行以下操作之一:
i = Interface()
i.r? #should show the docstring "the first register"
或
i = Interface()
i.r( #should show the docstring "the first register" when parentheses are opened
但是,docstring始终是obj.read返回的int对象,而不是指定的docstring。有没有办法在这种情况下显示正确的文档字符串?
如果我没有使用描述符但是手动定义它们,则在括号打开时它会起作用:
class Interface(object):
@property
def r(self):
"""this docstring will be shown alternatively"""
return self.read(0x0)
@r.setter
def r(self,v):
"""this is the docstring that is shown"""
self.write(0x0,v)
i = Interface()
i.r( #the right docstring pops up here once i open the bracket
如果setter没有定义文档字符串,则在打开括号时会显示其中一个getter。
我可以通过使用描述符以某种方式获得相同的行为而没有不合理的开销吗?
我的问题与此问题有些类似,但是没有给出令人满意的答案: Creating dynamic docstrings in Python descriptor