2010-11-15 9 views
52

Próbuję użyć deklarację właściwości new-style:'Nie można ustawić atrybut' z właściwościami nowego stylu w Pythonie

class C(object): 
    def __init__(self): 
     self._x = 0 

    @property 
    def x(self): 
     print 'getting' 
     return self._x 

    @x.setter 
    def set_x(self, value): 
     print 'setting' 
     self._x = value 

if __name__ == '__main__': 
    c = C() 
    print c.x 
    c.x = 10 
    print c.x 

i zobaczyć, co następuje w konsoli:

pydev debugger: starting 
getting 
0 
File "\test.py", line 55, in <module> 
c.x = 10 
AttributeError: can't set attribute 

Co ja robię źle? P.S .: Deklaracja starego stylu działa dobrze.

+0

Wycofałem edycję, która zmienia ustawienie '' setting'' (astrstring) w 'print 'setting'' (proste polecenie debugowania). O ile jest prawdopodobne, że oświadczenie wydruku było zamierzone, nie ma żadnej szkody ani błędu w dokumencie, i nie ma to żadnego wpływu na to pytanie. –

Odpowiedz

76

The documentation says the following o użyciu formularza dekorator od property: (x. W tym przypadku)

Pamiętaj, aby podać dodatkowe funkcje takie same nazwy jako własność oryginalnej

mam nie mam pojęcia, dlaczego tak jest, jeśli używasz property jako funkcji do zwrócenia atrybutu, który można nazwać metodami, które chcesz.

Więc trzeba zmienić swój kod do następujących:

@x.setter 
def x(self, value): 
    'setting' 
    self._x = value 
+0

Ach, świetnie, widziałem to w innym miejscu, ale założyłem, że mogą nie wiedzieć o braku przeciążania metody Pythona. To wygląda bardziej czysto niż nazwa "set_x"! :) – Darthfett

+0

Do czego służy "ustawienie"? – zakdances

+1

@yourfriendzak - To jest docstring http://www.python.org/dev/peps/pep-0257/ –

13

Metoda ustawiacza musi mieć taką samą nazwę, jak procedura pobierająca. Nie martw się, dekorator wie, jak je odróżnić.

@x.setter 
def x(self, value): 
... 
6

Po wywołaniu @ x.setter @ x.getter lub @ x.deleter, podczas tworzenia nowego obiektu i mienia podając nazwę funkcji, którą dekorujesz. Naprawdę, wszystko, co ma znaczenie, to to, że kiedy ostatnio używasz dekoratora @ x. * Er w definicji klasy, ma on nazwę, której naprawdę chcesz użyć. Ale ponieważ zostawiłoby to miejsce w twojej klasie zanieczyszczone niekompletnymi wersjami właściwości, których chcesz użyć, najlepiej użyć tej samej nazwy, aby je wyczyścić.

Powiązane problemy