【问题标题】:How to set functions for a property()?如何为 property() 设置函数?
【发布时间】:2016-02-09 10:52:01
【问题描述】:

这是我正在开发的模拟器的寄存器的 sn-p:

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()

【问题讨论】:

    标签: python oop properties getter-setter


    【解决方案1】:

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

    所以有几个建议,首先如果这个包装类只是重新实现了 registerpair 的接口,你不应该只是从 registerpair 继承,这样原始接口就可以使用了吗?

    或者,您可以实现 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()
    

    【讨论】:

      【解决方案2】:

      如果我理解正确的话

      你可以调用 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. 
      

      【讨论】:

        【解决方案3】:

        按原样,没有。您已将 fget 方法设置为为您的 registerpair() 类返回 getval()

        由于该属性用于 _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() 之类的电话,这似乎是最清晰的做事方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          相关资源
          最近更新 更多