Article View: pl.comp.lang.python
Article #27228Re: class A: print A
From: Łukasz Rekucki
Date: Tue, 19 Jan 2010 13:07
Date: Tue, 19 Jan 2010 13:07
94 lines
3743 bytes
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-mailReferences:
<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