2010-10-26 5 views
11

Próbowałem użyć właściwości zamiast konkretnych ustawiaczy i pobierających w mojej aplikacji. Wydają się być bardziej pythonic i ogólnie sprawiają, że mój kod jest bardziej czytelny.Zastanawiam się, czy powinienem po prostu zwolnić za pomocą właściwości w python

Bardziej czytelny z wyjątkiem jednego numeru: Literówki.

rozważyć następujący prosty przykład (uwaga, moi właściwości faktycznie niektóre przetwarzania chociaż przykłady tutaj wystarczy ustawić lub powrót prostą zmienną)

class GotNoClass(object): 

    def __init__(self): 
     object.__init__(self) 
     self.__a = None 

    def __set_a(self, a): 
     self.__a = a 

    def __get_a(self): 
     return self.__a 

    paramName = property(__get_a, __set_a) 


if __name__ == "__main__": 
    classy = GotNoClass() 

    classy.paramName = 100 
    print classy.paramName 

    classy.paranName = 200 
    print classy.paramName 

    #oops! Typo above! as seen by this line: 
    print classy.paranName 

wyjściu jak każdy, kto czyta trochę ściśle zobaczy , to:

100 
100 
200 

Ups. Nie powinno to być wyjątkiem tego, że zrobiłem literówkę - napisałem paranName (dwa n-ki) zamiast paramName.

To jest łatwe do debugowania w tym prostym przykładzie, ale szkodziło mi to w moim większym projekcie. Ponieważ pyton z radością tworzy nową zmienną, gdy przypadkowo zamierzam użyć właściwości, dostaję subtelne błędy w moim kodzie. Błędy, które czasami trudno mi wytropić. Co gorsza, raz użyłem tej samej literówki (raz, gdy ustawiałem, a później raz, gdy otrzymywałem), więc mój kod wydawał się działać, ale dużo później, kiedy inna gałąź kodu próbowała wreszcie uzyskać dostęp do tej właściwości (poprawnie) Dostałem niewłaściwą wartość - ale zajęło mi to kilka dni, zanim zdałem sobie sprawę, że moje wyniki są trochę za niskie.

Teraz, kiedy wiem, że to jest problem, spędzam więcej czasu na baczniejszej lekturze mojego kodu, ale najlepiej byłbym w stanie złapać tę sytuację automatycznie - jeśli tęsknię za jednym z nich, mogę wprowadzić błąd, który nie pojawiają się, aż upłynie sporo czasu ...

Zastanawiam się, czy powinienem zmienić stare dobre setery i gettery? Czy jest jakiś fajny sposób na uniknięcie tej sytuacji? Czy ludzie po prostu polegają na sobie, aby złapać te błędy ręcznie? Niestety, nie jestem profesjonalnym programistą, po prostu ktoś, kto próbuje coś tu zrobić w pracy i tak naprawdę nie wiem, jak najlepiej to podejść.

Dzięki.

P.S. Rozumiem, że jest to także jedna z zalet Pythona i nie narzekam na to. Zastanawiam się tylko, czy lepiej byłoby używać programów ustawiających i pobierających.

+0

To samo dzieje się w przypadku prostych atrybutów, nie wspominając o zmiennych lokalnych. Jest to bezpośredni efekt uboczny projektowania języka i próba "naprawienia" generalnie spowoduje większe problemy. Jednak nigdy nie uważałem tego za poważny problem. –

+0

Jest to absolutnie prawdziwe i po tym, jak napisałem, myślałem o tym trochę więcej. Myślę, że powodem, dla którego dzieje się to bardziej, jest to, że teraz tak bardzo polegam na właściwościach (w porównaniu z moimi dawnymi ustawiaczami i pozyskującymi), a więc bardziej prawdopodobne jest wystąpienie takiego błędu. Sztuką będzie po prostu zminimalizować problem tak bardzo, jak to możliwe i być bardziej ostrożnym. – Ben

Odpowiedz

0

Są chwile, kiedy sprawdzanie podczas kompilacji naprawdę oszczędza czas. Wydaje się, że zidentyfikowałeś jeden taki przypadek. Przez przypadek, a nie przez ostrożny wybór, używam programów pobierających i ustawiających i jestem szczęśliwy ;-)

2

W zależności od tego, jak działa Twój kod, możesz spróbować użyć opcji slots. Dostaniesz wyjątek AttributeError, gdy spróbujesz przypisać coś, czego nie ma w slotach, co sprawi, że takie literówki będą bardziej oczywiste.

+0

Wow.Automaty są bardzo ciekawe (i nowe dla mnie). Na pewno będę je wdrażał jako część mojej aplikacji, ale nie do rozwiązania tego problemu. W tym przypadku wydaje się, że może to być nadużycie ich zamierzonego celu (co, jak przypuszczam, polega na zmniejszeniu śladów pamięciowych obiektów, które prawdopodobnie będą wielokrotnie uruchamiane). Jedną z rzeczy, które rozważam, jest tymczasowe wykorzystanie ich podczas programowania, a następnie wyłączenie ich po ukończeniu mojego kodu - w ten sposób będą mnie utrzymywać uczciwie, ale nie będą już w użyciu (lub nadużycia?), Gdy moja aplikacja zostanie kompletny. – Ben

+0

W drugiej chwili, patrząc na niektóre niezamierzone konsekwencje używania __slots__, nie będę ich implementował nawet podczas programowania. Wciąż bardzo fajnie się o tym uczymy. – Ben

Powiązane problemy