Article View: pl.comp.lang.python
Article #26993Re: dyskryptory
From: Rob Wolfe
Date: Sat, 28 Nov 2009 13:04
Date: Sat, 28 Nov 2009 13:04
77 lines
3356 bytes
3356 bytes
ak3031884 <ak3031884@gmail.com> writes:
> Witam,
> zabieram się za temat dyskryptorów po raz ......no dużo tego było ale
> tym razem powiedziałem sobie że nie odpuszcze bo nie rozumiem całego
> stanu rzeczy z dyskryptorami po co je wymyślili dojście do składowych
> klasy w pythonnie możemy uzyskać w bardzo prosyt sposób prawda
>
> clsss myClass():
> def __init__(self, a, b):
> self.a = a
> self.b = b
> return
>
> my = Class()
> my.a =1
> my.b=2
>
> czysyt ładny kod, dojście jest a jeżeli chcemy to zakapsułkować to
> zawsz możemy zmienne ustawić na
> self.__a będzie to zmienna praywatna której nie zmodyfikujemy
> z dyskryptorami będzie to wyglądało tak
>
> class myClass(object):
> def __init__(self, self, a, b):
> self.a = a
> self.b = b
>
> def __get__(self, obj, objtype):
> return self.a
>
> def __set__(self, obj, val):
> self.a = a
>
> 2 klasa nie wiem czy dobrze napisana bo nie rozumiem tego ale to koło
> tego ma wyglądać.
> Tak czy inaczej więcej pisania, zagmatwane, moim skromnym zdaniem nie
> bardzo czytelne,
> wytłumaczcie mi co w tym takiego dobrego iż jest to wprowadzane do
> każdego języka programowania.
Zapewne znana Ci jest funkcja "property":
http://docs.python.org/library/functions.html?highlight=property#property
Czy masz jakieś wątpliwości, że jest użyteczna (szczególnie
w kontekście wszechobecnych setterów i getterów)?
"Property" tworzy właśnie deskryptor, który wygląda tak:
class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
if doc is None and fget is not None and hasattr(fget, "__doc__"):
doc = fget.__doc__
self.__get = fget
self.__set = fset
self.__del = fdel
self.__doc__ = doc
def __get__(self, inst, type=None):
if inst is None:
return self
if self.__get is None:
raise AttributeError, "unreadable attribute"
return self.__get(inst)
def __set__(self, inst, value):
if self.__set is None:
raise AttributeError, "can't set attribute"
return self.__set(inst, value)
def __delete__(self, inst):
if self.__del is None:
raise AttributeError, "can't delete attribute"
return self.__del(inst)
RW
Technical Details
Message-ID:
<87y6lqiyvv.fsf@smsnet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<5bd250e8-db03-47e8-b06b-ef13ad844f7d@o10g2000yqa.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: Rob Wolfe <rw@smsnet.pl> Newsgroups: pl.comp.lang.python Subject: Re: dyskryptory Date: Sat, 28 Nov 2009 14:04:36 +0100 Organization: Debian GNU/Linux site Lines: 77 Message-ID: <87y6lqiyvv.fsf@smsnet.pl> References: <5bd250e8-db03-47e8-b06b-ef13ad844f7d@o10g2000yqa.googlegroups.com> NNTP-Posting-Host: ip-79-175-248-34.cable.smsnet.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1259413468 6721 79.175.248.34 (28 Nov 2009 13:04:28 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Sat, 28 Nov 2009 13:04:28 +0000 (UTC) Cancel-Lock: sha1:UQmTJ+pBrrwAYsV8VecrjUUMahU= X-User: rw8899 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit