2015-11-08 3 views
2

Это фрагмент для регистров для эмулятора я работаю:Как установить функции для свойства()?

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

ответ

1

как есть, нет. Вы установили метод fget для возврата getval() для вашего класса registerpair().

Поскольку свойство для атрибута _AF который является registerpair() экземпляром, я считаю, что было бы более разумным, чтобы изменить свою fgetfset по этому вопросу), чтобы фактически вернуть его, и, возможно, создать вспомогательную функцию, чтобы фактически получить значение с getval() или получить к нему доступ напрямую.

Так что, если ваш _get_AF смотрел что-то вроде:

def _get_AF(self): 
    return self._AF 

вы можете назвать r.AF.increment() просто отлично. Тогда вы могли бы переместить getval() вызов другой функции в классе:

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

Или просто сделать прямые звонки, как r.AF.getval(), который, кажется, как самый ясный способ делать вещи.

0

Вы эффективны изменяющим интерфейс к классу registerpair с помощью этого класса-оболочки , и при этом скрывает исходный интерфейс. Таким образом, в вашем новом интерфейсе свойство() в Python относится к значениям, хранящимся в регистровой папке, а не к самому регистровому элементу, поскольку он повторно заполняет интерфейс getval() и setval() регистратора.

Итак, пара предложений, во-первых, если этот класс-оболочка просто переопределяет интерфейс к регистру, если вы не просто наследуете от регистратора, то каким образом будет доступен исходный интерфейс?

В качестве альтернативы вы можете реализовать оставшуюся часть интерфейса 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() 
0

Если я вас правильно понял

Вы можете назвать r._AF.increment(), какие ссылки registerpair() объект но поскольку self._AF является частным методом, вы не можете использовать

r.AF.increment() 

для дальнейшего information..check этого

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. 
Смежные вопросы