🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
2 messages
2 total messages Started by ak3031884 Fri, 27 Nov 2009 21:21
dyskryptory
#26982
Author: ak3031884
Date: Fri, 27 Nov 2009 21:21
38 lines
2268 bytes
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.
Re: dyskryptory
#26993
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads