🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Metaklasy w Pythonie

#27126
From: Łukasz Rekucki
Date: Mon, 04 Jan 2010 02:23
49 lines
2888 bytes
On Jan 3, 11:40 pm, pr <crico...@gmail.com> wrote:
> Witam,
>
> Czy da się tak zrobić aby "metaklasa była lazy", to znaczy, aby
> wywołanie metody __new__ w MyMeta nastąpiło w wyniku świadomego
> odwołania do klasy B (patrz kod niżej), czyli, np kiedy zrobię tak:
Do pewnego stopnia tak, tylko nie bardzo wiem po co. Coś jako to B
wstawić musisz. Zresztą są prostsze sposoby zrobienia fabryki.

> print B.myattr
> print B().myattr
> a nie w chwili gdy interpreter napotka już tylko samą definicję klasy
> (czyli za każdym razem, niezależnie czy jej używam):
> class B(A): pass
> ?
Definicja klasy, to też jej utworzenie.
>>> class K(object): pass
jest równoznaczne z:
>>> K = type('K', (object,), {})
Metaklasa sprawia jedynie, że to się zamienia w:
>>> K = my_meta('K', (object,), {})
>
> Z góry dzięki za odpoweidź.
>
> class MyMeta(type):
>
>     def __new__(cls, name, bases, attrs):
>         print "Metaclass"
>         super_new = super(MyMeta, cls).__new__
>         parents = [b for b in bases if isinstance(b, MyMeta)]
O ile nie zadeklarujesz podklasy MyMeta z MyMeta jako jej metaklasą,
to raczej nie ma szans na spełnienie tego warunku.

>         if not parents:
>             return super_new(cls, name, bases, attrs)
>
>         module = attrs.pop('__module__')
>         new_class = super_new(cls, name, bases, {'__module__':
> module})
>         ...
>         ...
>         return new_class
>
> class A(object):
>
>     __metaclass__ = MyMeta
>
> class B(A):
>     pass
Technical Details
Message-ID: <79eee268-9a76-4950-a13b-d0ce21d5879f@35g2000yqa.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!35g2000yqa.googlegroups.com!not-for-mail
References: <acd8187e-60ea-4eda-9eb6-52f5d3754d2b@a21g2000yqc.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!35g2000yqa.googlegroups.com!not-for-mail
From: Łukasz Rekucki <lrekucki@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: Metaklasy w Pythonie
Date: Sun, 3 Jan 2010 18:23:44 -0800 (PST)
Organization: http://groups.google.com
Lines: 51
Message-ID: <79eee268-9a76-4950-a13b-d0ce21d5879f@35g2000yqa.googlegroups.com>
References: <acd8187e-60ea-4eda-9eb6-52f5d3754d2b@a21g2000yqc.googlegroups.com>
NNTP-Posting-Host: 212.76.62.207
Mime-Version: 1.0
X-Trace: posting.google.com 1262571824 688 127.0.0.1 (4 Jan 2010 02:23:44 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Mon, 4 Jan 2010 02:23:44 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: 35g2000yqa.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.43 Safari/532.5,gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit