Article View: pl.comp.lang.python
Article #27997Re: Kontrola typów i wartości dla własności
From: Rob Wolfe
Date: Tue, 05 Apr 2011 18:50
Date: Tue, 05 Apr 2011 18:50
54 lines
2983 bytes
2983 bytes
"Waldek M." <wm@localhost.localdomain> writes:
> Cześć,
>
> Mam pytanie odnośnie własności (właściwości? jak by tu dobrze przetłumaczyć
> 'property'?) w Pythonie (używam 3.2).
Wolę "właściwość", ale nie potrafię tego uzasadnić. ;)
> Zbudowałem sobie klasę z własnością "foo", w sposób następujący:
> class bar:
> def __init__(self):
> self._foo = [1,2,3,4]
> @property
> def foo(self):
> print("Getter")
> return self._foo
> @foo.setter
> def foo(self, value):
> print("Setter")
> self._foo = value
>
> Chciałbym wprowadzić kontrolę rozmiaru tej tablicy/listy, jak i wkładanych
> do niej wartości.
>
> b = bar()
> b.foo = [2,4,5,1] # tutaj mogę wprowadzić kontrolę za pomocą settera
> b.foo[1] = "zasmażka" # tutaj już jest problem
>
> Domyślam się, że w tej drugiej opcji wołany jest raczej getter,
> zwracający referencję do tablicy, w której jest ustawiana stosowna wartość.
>
> Czy można w jakiś sposób kontrolować przypadek nr 2, a jeśli tak,
> to w jaki? Myślałem o użyciu jakiegoś własnego typu zamiast
> listy i kontrolowanie typów na jej poziomie, ale to spory 'overkill'.
>
> Wszelkie konstruktywne pomysły i linki mile widziane.
W takich przypadkach pierwszą opcją, którą trzeba na poważnie
rozważyć jest enkapsulacja. Udostępnianie na zewnątrz własnych
struktur danych (w tym przypadku `_foo`) jest z definicji niedobre.
Po to zdefiniowałeś `_foo` jako składową niepubliczną, aby nikt
nie miał do niej bezpośredniego dostępu.
Skoro tak to API powinno wyglądać jakoś tak:
def add_value(self, value)
def get_value(self, index)
Gdy jednak zmiana API nie wchodzi w grę (te miliony użytkowników
na całym świecie), to w tym przypadku jedyną drogą jaką widzę
jest użycie własnego typu. Nie jest to jakiś wielki "overkill",
ale jak dla mnie niezbyt eleganckie rozwiązanie.
RW
Technical Details
Message-ID:
<87d3l0o7l9.fsf@smsnet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!news.uni-stuttgart.de!news.stw-bonn.de!news.netcologne.de!newsfeed-fusi2.netcologne.de!newsfeed.straub-nv.de!feeder.news-service.com!94.75.214.39.MISMATCH!aioe.org!.POSTED!not-for-mailReferences:
<y4f0sfs7c4ca.dlg@localhost.localdomain>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!news.uni-stuttgart.de!news.stw-bonn.de!news.netcologne.de!newsfeed-fusi2.netcologne.de!newsfeed.straub-nv.de!feeder.news-service.com!94.75.214.39.MISMATCH!aioe.org!.POSTED!not-for-mail From: Rob Wolfe <rw@smsnet.pl> Newsgroups: pl.comp.lang.python Subject: Re: Kontrola typów i wartości dla własności Date: Tue, 05 Apr 2011 20:50:58 +0200 Organization: Aioe.org NNTP Server Lines: 54 Message-ID: <87d3l0o7l9.fsf@smsnet.pl> References: <y4f0sfs7c4ca.dlg@localhost.localdomain> NNTP-Posting-Host: 2rGoQNolRk9jw3eVwM369A.user.speranza.aioe.org Mime-Version: 1.0 X-Complaints-To: abuse@aioe.org User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) X-Notice: Filtered by postfilter v. 0.8.2 Cancel-Lock: sha1:A6tCfYg/cQbgSWOMRmjrpLH+EU4= Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit