Собственность getter / setter не имеет никакого эффекта в Python 2 - PullRequest
8 голосов
/ 06 февраля 2012

Я немного запутался в свойствах Python. Рассмотрим следующий код

class A:
    @property
    def N(self):
        print("A getter")
        return self._N
    @N.setter
    def N(self,v):
        print("A setter")
        self._N = v

    def __init__(self):
        self._N = 1

class B:
    @property
    def N(self):
        print("B getter")
        return self.a.N
    @N.setter
    def N(self,v):
        print("B setter")
        self.a.N = v

    def __init__(self):
        self.a = A()

if __name__ == '__main__':
    b=B()
    b.N = 2
    print(b.N, b.a.N)
    b.N = 3
    print(b.N, b.a.N)

B должен быть чем-то вроде обертки для A. Он использует геттеры и сеттеры для отображения свойств A на себя (конечно, это также можно сделать с помощью наследования). Проблема в том, что он просто не работает как положено в python2.6, а в python3:

> python2 test.py
A getter
(2, 1)
A getter
(3, 1)

> python3 test.py
B setter
A setter
B getter
A getter
A getter
2 2
B setter
A setter
B getter
A getter
A getter
3 3

Я что-то не так делаю или в чем проблема?

1 Ответ

23 голосов
/ 06 февраля 2012

A и B должны быть классами нового стиля в Python 2.x.

property([fget[, fset[, fdel[, doc]]]])

Возвращает атрибут свойства для классов нового стиля (классов, производных от object ).

Так что, если вы будете наследовать от object

class A(object):
   ...

class B(object):
    ...

Ваш код будет работать как положено.

...