🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #26993

Re: dyskryptory

#26993
From: Rob Wolfe
Date: Sat, 28 Nov 2009 13:04
77 lines
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-mail
References: <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