如何为 属性() 设置函数?
How to set functions for a property()?
这是我正在使用的模拟器的寄存器片段:
class registers(object):
def __init__(self):
self._AF = registerpair()
def _get_AF(self):
return self._AF.getval()
def _set_AF(self, val):
self._AF.setval(val)
AF = property(_get_AF, _set_AF)
registerpair()
class 有一个 increment()
方法。我想知道是否有任何方法可以执行以下操作:
r = registers()
r.AF.increment()
而不是必须做:
r._AF.increment()
您正在使用此包装器 class 有效地修改寄存器对 class 的接口,并在这样做时隐藏原始接口。因此,在您的新界面中, Python 中的 属性() 指的是存储在寄存器对中的值,而不是寄存器对本身,因为它重新实现了寄存器对的 getval() 和 setval() 接口.
所以有几个建议,首先,如果这个包装器 class 只是重新实现寄存器对的接口,你是否应该只继承寄存器对,这样原始接口就可以使用了?
或者,您可以实现 registerpair 接口的其余部分,例如使用 registers.increment_AF():
之类的方法
class registers(object):
def __init__(self):
self._AF = registerpair()
def _get_AF(self):
return self._AF.getval()
def _set_AF(self, val):
self._AF.setval(val)
AF = property(_get_AF, _set_AF)
def increment_AF(self):
self._AF.increment()
如果我没理解错的话
您可以调用 r._AF.increment()
引用 registerpair()
对象 但是 因为 self._AF 是您不能使用的私有方法
r.AF.increment()
了解更多信息..检查这个
https://www.python.org/dev/peps/pep-0008/
本网站的摘录
_single_leading_underscore : weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
single_trailing_underscore_ : used by convention to avoid conflicts with Python keyword, e.g.
原样,没有。您已将 fget
方法设置为 return a getval()
用于您的 registerpair()
class。
由于 属性 是针对 _AF
属性的 registerpair()
实例,我相信更改 fget
(和 fset
)实际 return 它,并可能创建一个辅助函数来实际使用 getval()
获取值或直接访问它。
因此,如果您的 _get_AF
看起来像:
def _get_AF(self):
return self._AF
然后您可以调用 r.AF.increment()
就好了。然后您可以将 getval()
调用移动到 class 中的另一个函数:
def getAFval(self):
self._AF.getval()
或者像 r.AF.getval()
这样的直接调用,这似乎是最清晰的做事方式。
这是我正在使用的模拟器的寄存器片段:
class registers(object):
def __init__(self):
self._AF = registerpair()
def _get_AF(self):
return self._AF.getval()
def _set_AF(self, val):
self._AF.setval(val)
AF = property(_get_AF, _set_AF)
registerpair()
class 有一个 increment()
方法。我想知道是否有任何方法可以执行以下操作:
r = registers()
r.AF.increment()
而不是必须做:
r._AF.increment()
您正在使用此包装器 class 有效地修改寄存器对 class 的接口,并在这样做时隐藏原始接口。因此,在您的新界面中, Python 中的 属性() 指的是存储在寄存器对中的值,而不是寄存器对本身,因为它重新实现了寄存器对的 getval() 和 setval() 接口.
所以有几个建议,首先,如果这个包装器 class 只是重新实现寄存器对的接口,你是否应该只继承寄存器对,这样原始接口就可以使用了?
或者,您可以实现 registerpair 接口的其余部分,例如使用 registers.increment_AF():
之类的方法class registers(object):
def __init__(self):
self._AF = registerpair()
def _get_AF(self):
return self._AF.getval()
def _set_AF(self, val):
self._AF.setval(val)
AF = property(_get_AF, _set_AF)
def increment_AF(self):
self._AF.increment()
如果我没理解错的话
您可以调用 r._AF.increment()
引用 registerpair()
对象 但是 因为 self._AF 是您不能使用的私有方法
r.AF.increment()
了解更多信息..检查这个
https://www.python.org/dev/peps/pep-0008/
本网站的摘录
_single_leading_underscore : weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.
single_trailing_underscore_ : used by convention to avoid conflicts with Python keyword, e.g.
原样,没有。您已将 fget
方法设置为 return a getval()
用于您的 registerpair()
class。
由于 属性 是针对 _AF
属性的 registerpair()
实例,我相信更改 fget
(和 fset
)实际 return 它,并可能创建一个辅助函数来实际使用 getval()
获取值或直接访问它。
因此,如果您的 _get_AF
看起来像:
def _get_AF(self):
return self._AF
然后您可以调用 r.AF.increment()
就好了。然后您可以将 getval()
调用移动到 class 中的另一个函数:
def getAFval(self):
self._AF.getval()
或者像 r.AF.getval()
这样的直接调用,这似乎是最清晰的做事方式。