🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
4 messages
4 total messages Started by Daniel Mróz Thu, 20 May 2010 17:25
Rev-super
#27476
Author: Daniel Mróz
Date: Thu, 20 May 2010 17:25
57 lines
1946 bytes
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.



Dzięki i pozdrawiam
Beorn

-- 
Daniel 'Beorn' Mróz <beorn@alpha.pl>    http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V!  PS+ PE++ Y+ PGP++ t- 5  X R !tv b+ DI D++ G++ e h*]
[                          r++  y+                           ]
Re: Rev-super
#27477
Author: 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
Re: Rev-super
#27479
Author: William Bonawentura
Date: Fri, 21 May 2010 05:40
2 lines
1019 bytes
if self.__class__ == BaseFoo:
    raise NotImplementedError( "%s is abstract" % self.__class__.__name__ )
Re: Rev-super
#27478
Author: Darek
Date: Fri, 21 May 2010 06:31
14 lines
1760 bytes
On 20 Maj, 19:25, Daniel Mróz <be...@alpha.pl> wrote:
> Cześć
>
> Naszło mnie dzisiaj na "zabezpieczanie" klas i zrodziło się w
> głowie mej pytanie: jak wykryć czy klasa coś dziedziczy?
Sterowanie zachowaniem klasy w takim wypadku powinno być robione z
poziomu metaklasy.

A tak z drugiej strony należy się zastanowić dlaczego w języku Python
nie wprowadzono instrukcji/metod/typów klas w prosty sposób
gwarantujący zachowanie jakie chcesz osiągnąć. Hmmm może dlatego, że
jest to niepotrzebne? :-)

Pozdrawiam.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads