🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: class A: print A

#27228
From: Łukasz Rekucki
Date: Tue, 19 Jan 2010 13:07
94 lines
3743 bytes
On Jan 19, 11:55 am, tikan <tik...@gmail.com> wrote:
> On 18 Sty, 22:43, Łukasz Rekucki <lreku...@gmail.com> wrote:
>
>
>
>
>
> > On Jan 18, 8:24 pm, tikan <tik...@gmail.com> wrote:
>
> > > Witam
>
> > > class A:
> > >     print A
>
> > > Traceback (most recent call last):
> > >   File "<stdin>", line 1, in <module>
> > >   File "<stdin>", line 2, in A
> > > NameError: name 'A' is not defined
>
> > > Jak wyjaśnić takie zachowanie interpretera?
>
> > Tym, że w trakcie wykonywania ciała klasy A, jeszcze jej nie ma. Więc
> > skoro w aktualnym bloku nie ma nazwy "A" i w aktualnym module też nie
> > ma nazwy "A", to znaczy, że jej nie ma. Co się spodziewałeś uzyskać ?
>
> > > Pozdrawiam
> > > Krzysztof Chmiel
>
> Spodziewałem się, że nazwa klasy jest wpisywana do słownika modułu w
> linijce class A:
> Problem wziął się stąd, że chciałem utworzyć dekorator do metody klasy
> przyjmujący obiekt klasy jako argument
> class A:
>     @my_decorator(A)
>     def f(self):
>         pass

> Ale jak widać nie działa to tak. Może i słusznie, bo w momencie
> wywoływania dekoratora nie byłyby znane wszystkie atrybuty klasy i
> działanie kodu
> byłoby zależne od kolejności definicji funkcji w klasie.
Zazwyczaj nie musisz znać klasy podczas dekorowania. Wtedy wystarczy
wyciągnąć we wrapperze type(self). Czasem jednak jest to użyteczne i
da się osiągnąć coś zbliżonego za pomocą metaklasy:

def decor(func):
    func._redecor = True
    return func

def real_decor(klass, func):
    def wrapper(*args, **kwargs):
        print "Calling \"%s\" defined in \"%s\"" % (func.__name__,
klass.__name__)
        return func(*args, **kwargs)
    return wrapper

class Meta(type):

    def __new__(cls, name, bases, class_fields):
        klass = type.__new__(cls, name, bases, class_fields)

        for k in klass.__dict__:
            v = getattr(klass, k)
            if hasattr(v, "_redecor"):
                setattr(klass, k, real_decor(klass, v))

        return klass

class A(object):
    __metaclass__ = Meta
    @decor
    def alpha(self): pass

class B(A):

    @decor
    def alpha(self):
        super(B, self).alpha()

    @decor
    def beta(self): pass

a = A()
a.alpha()
b = B()
b.alpha()
b.beta()

>
> Pozdrawiam
> Krzystof Chmiel

Pozdrawiam,
Łukasz Rekucki
Technical Details
Message-ID: <32def6f6-8774-46ab-abdd-52c044e64e84@k17g2000yqh.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!k17g2000yqh.googlegroups.com!not-for-mail
References: <2c102a9d-5722-4565-8562-346d08ec395d@34g2000yqp.googlegroups.com> <eb25832e-a736-4163-b0ef-de2fafe611b5@k17g2000yqh.googlegroups.com> <ac53f534-6955-4df7-a405-ae545c0fb8c6@h2g2000yqj.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!k17g2000yqh.googlegroups.com!not-for-mail
From: Łukasz Rekucki <lrekucki@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: class A: print A
Date: Tue, 19 Jan 2010 05:07:16 -0800 (PST)
Organization: http://groups.google.com
Lines: 99
Message-ID: <32def6f6-8774-46ab-abdd-52c044e64e84@k17g2000yqh.googlegroups.com>
References: <2c102a9d-5722-4565-8562-346d08ec395d@34g2000yqp.googlegroups.com>  <eb25832e-a736-4163-b0ef-de2fafe611b5@k17g2000yqh.googlegroups.com>  <ac53f534-6955-4df7-a405-ae545c0fb8c6@h2g2000yqj.googlegroups.com>
NNTP-Posting-Host: 212.76.62.207
Mime-Version: 1.0
X-Trace: posting.google.com 1263906436 7964 127.0.0.1 (19 Jan 2010 13:07:16 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Tue, 19 Jan 2010 13:07:16 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: k17g2000yqh.googlegroups.com; posting-host=212.76.62.207;  posting-account=5fpXZwoAAADF-CUdCuJ-FpYxG8__-wRx
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US)  AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.64 Safari/532.5,gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit