Article View: pl.comp.lang.python
Article #27227Re: class A: print A
From: tikan
Date: Tue, 19 Jan 2010 18:32
Date: Tue, 19 Jan 2010 18:32
110 lines
4585 bytes
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-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> <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