2012-02-06 12 views
8

Jestem trochę zdezorientowany na temat właściwości w python. Rozważmy następujący kodWłaściwość python getter/setter confusion

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 powinno być coś jak otoczka do A. Wykorzystuje pobierające i ustawiające do mapowania właściwości A na sobie (oczywiście można też zrobić to poprzez dziedziczenie). Problem polega na tym, że po prostu nie działa zgodnie z oczekiwaniami w python2.6 podczas gdy to robi w 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 

robię nic złego ani gdzie dokładnie jest problem?

Odpowiedz

18

A i B muszą być klasami nowego stylu w Pythonie 2.x.

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

Powrót atrybutem nieruchomość za new-style classes (klas, które wynikają z object).

Więc jeśli będziesz czerpać z object

class A(object): 
    ... 

class B(object): 
    ... 

Twój kod będzie działać zgodnie z oczekiwaniami.

+0

OK, masz rację, to rozwiązuje, ale i tak nie rozumiem, co tu jest nie tak. – buergi

+1

@buergi Stare klasy nie mogą mieć deskryptorów. '@ Właściwość' jest deskryptorem. Więcej informacji na stronie [Python Data model reference] (http://docs.python.org/reference/datamodel.html) – reclosedev

Powiązane problemy