如何为 属性() 设置函数?

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() 这样的直接调用,这似乎是最清晰的做事方式。