如何设置property()的函数?

时间:2015-11-08 19:39:24

标签: python oop properties getter-setter

这是我正在处理的模拟器的寄存器片段:

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()类有increment()方法。我想知道是否有任何办法可以做到以下几点:

r = registers()
r.AF.increment()

而不是必须这样做:

r._AF.increment()

3 个答案:

答案 0 :(得分:1)

原样,没有。您已设置fget方法,以便为getval()课程返回registerpair()

由于该属性适用于_AFregisterpair()个实例属性,因此我认为更改fget(和fset更合理)实际返回它,并可能创建一个辅助函数来实际获取getval()的值或直接访问它。

所以如果你的_get_AF看起来像:

def _get_AF(self):
    return self._AF

然后你可以调用r.AF.increment()就好了。然后,您可以将getval()调用移动到您班级中的另一个函数:

def getAFval(self):
    self._AF.getval()

或者直接拨打r.AF.getval()这样的直接电话,这似乎是最明确的做事方式。

答案 1 :(得分:0)

您正在使用此包装类有效地修改registerpair类的接口,并且这样做会隐藏原始接口。因此,在新接口中,Python中的property()引用存储在registerpair中的值,而不是寄存器对本身,因为它重新实现了registerpair的getval()和setval()接口。

所以有一些建议,首先如果这个包装类只是重新实现了registerpair的接口,那么你是不是只从registerpair继承,那么原始接口是否可用?

或者你可以实现registerpair接口的其余部分,例如使用register.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()

答案 2 :(得分:0)

如果我理解正确

您可以致电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.