🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Rev-super

#27477
From: Piotr Husiatynski
Date: Thu, 20 May 2010 17:51
76 lines
2396 bytes
Dnia 20.05.2010 Daniel Mróz <beorn@alpha.pl> napisał/a:
> Cześć
>
> Naszło mnie dzisiaj na "zabezpieczanie" klas i zrodziło się w
> głowie mej pytanie: jak wykryć czy klasa coś dziedziczy? Przykład,
> mam klasę bazową BaseFoo, która sama z siebie niewiele jest w stanie
> zrobić, zatem nie ma większego sensu tworzyć na jej podstawie obiektów.
> Chciałbym zrobić taki myk, żeby konstruktor wyczajał czy klasa jest
> tworzona z dziedziczenia, czy bezpośrednio. Czyli:
>
>
>
>     class BaseFoo(object):
> 	def __init__(self):
> 	    if not im_inherited():
> 		raise Exception('Booo!')
>
>
>     class FooA(BaseFoo):
> 	def __init__(self):
> 	    BaseFoo.__init__(self)
>
>
>
> Teraz, coś takiego:
>
>
>     a = FooA()
>
>
> tworzy nam piękny obiekt, zaś:
>
>
>     a = BaseFoo()
>
>
> wali wyjątkiem Exception('Booo!').
> Czy jest to możliwe, a jeśli tak to jak?
> Gdyby jeszcze dało się to zapakować w dekorator, typu:
>
>
>     @baseclass
>     class BaseFoo(object):
> 	[...]
>
>
> byłoby super.

Do czego cos takiego może być przydatne? Przecież Python to nie Java.

def baseclass(cls):
    baseclass_name = cls.__name__
    baseclass_init = cls.__init__

    def fake_init(self, *args, **kwds):
        if type(self).__name__ == baseclass_name:
            raise Exception('Base class')
        baseclass_init(self, *args, **kwds)
    
    cls.__init__ = fake_init
    return cls


@baseclass
class Base(object):
    pass

class Foo(Base):
    pass

foo = Foo()
base = Base()


-- 
Piotr Husiatyński
Technical Details
Message-ID: <slrnhvatkr.58u.husio@oceanic.wsisiz.edu.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!not-for-mail
References: <slrnhvasos.cdd.beorn@pino.cyberdeck.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!not-for-mail
From: Piotr Husiatynski <husio@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: Rev-super
Date: Thu, 20 May 2010 17:51:23 +0000 (UTC)
Organization: WSISiZ
Lines: 76
Message-ID: <slrnhvatkr.58u.husio@oceanic.wsisiz.edu.pl>
References: <slrnhvasos.cdd.beorn@pino.cyberdeck.pl>
Reply-To: Piotr Husiatynski <phusiatynski@gmail.com>
NNTP-Posting-Host: oceanic.wsisiz.edu.pl
Mime-Version: 1.0
X-Trace: portraits.wsisiz.edu.pl 1274377883 18829 2001:1a68:a::33 (20 May 2010 17:51:23 GMT)
X-Complaints-To: abuse@wsisiz.edu.pl
NNTP-Posting-Date: Thu, 20 May 2010 17:51:23 +0000 (UTC)
User-Agent: slrn/0.9.9p1 (Linux)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit