这是我正在处理的模拟器的寄存器片段:
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()
答案 0 :(得分:1)
原样,没有。您已设置fget
方法,以便为getval()
课程返回registerpair()
。
由于该属性适用于_AF
个registerpair()
个实例属性,因此我认为更改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.