🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: class A: print A

#27227
From: tikan
Date: Tue, 19 Jan 2010 18:32
110 lines
4585 bytes
On 19 Sty, 14:07, Łukasz Rekucki <lreku...@gmail.com> wrote:
> 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:
>
...
>
>
>
> > Pozdrawiam
> > Krzystof Chmiel
>
> Pozdrawiam,
> Łukasz Rekucki

Dziękuję, to rozwiązało mój problem.
Oto kod dekoratora imitującego działanie adnotacji @Override z javy:
def override(func):
    func._redecor = True
    return func

def real_override(cls, func):
    if all(not hasattr(base, func.__name__) for base in
cls.__bases__):
        raise Exception("%s does not overrides base class method" %
func.__name__)

    return func

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_override(klass, v))

        return klass

class A(object):
    __metaclass__ = Meta
    def f(self):
        pass
    def g(self):
        pass

class B(A):
    __metaclass__ = Meta

    @override
    def f(self):
        pass #ok

    @override
    def zsd(self):
        pass #error

Traceback (most recent call last):
  File "override.py", line 29, in <module>
    class B(A):
  File "override.py", line 18, in __new__
    setattr(klass, k, real_override(klass, v))
  File "override.py", line 7, in real_override
    raise Exception("%s does not overrides base class method" %
func.__name__)
Exception: zsd does not overrides base class method

Pozdrawiam
Krzysztof Chmiel
Technical Details
Message-ID: <dea39044-ae10-4a72-a059-c229dc379008@p24g2000yqm.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news-1.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.belwue.de!kanaga.switch.ch!switch.ch!news.tele.dk!news.tele.dk!small.news.tele.dk!feed118.news.tele.dk!postnews.google.com!p24g2000yqm.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> <32def6f6-8774-46ab-abdd-52c044e64e84@k17g2000yqh.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-1.dfn.de!news.dfn.de!news.uni-stuttgart.de!news.belwue.de!kanaga.switch.ch!switch.ch!news.tele.dk!news.tele.dk!small.news.tele.dk!feed118.news.tele.dk!postnews.google.com!p24g2000yqm.googlegroups.com!not-for-mail
From: tikan <tikan2@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: class A: print A
Date: Tue, 19 Jan 2010 10:32:36 -0800 (PST)
Organization: http://groups.google.com
Lines: 116
Message-ID: <dea39044-ae10-4a72-a059-c229dc379008@p24g2000yqm.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>  <32def6f6-8774-46ab-abdd-52c044e64e84@k17g2000yqh.googlegroups.com>
NNTP-Posting-Host: 77.236.2.100
Mime-Version: 1.0
X-Trace: posting.google.com 1263925956 32078 127.0.0.1 (19 Jan 2010 18:32:36 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Tue, 19 Jan 2010 18:32:36 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: p24g2000yqm.googlegroups.com; posting-host=77.236.2.100;  posting-account=SQnbsAoAAAAwrHvztykwXpM70ECXxG0y
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.1.5)  Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729),gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit