Thread View: pl.comp.lang.python
4 messages
4 total messages
Started by Daniel Mróz
Thu, 20 May 2010 17:25
Rev-super
Author: Daniel Mróz
Date: Thu, 20 May 2010 17:25
Date: Thu, 20 May 2010 17:25
57 lines
1946 bytes
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
Author: Piotr Husiatynski
Date: Thu, 20 May 2010 17:51
Date: Thu, 20 May 2010 17:51
76 lines
2396 bytes
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
Author: William Bonawentura
Date: Fri, 21 May 2010 05:40
Date: Fri, 21 May 2010 05:40
2 lines
1019 bytes
1019 bytes
if self.__class__ == BaseFoo:
raise NotImplementedError( "%s is abstract" % self.__class__.__name__ )
Re: Rev-super
Author: Darek
Date: Fri, 21 May 2010 06:31
Date: Fri, 21 May 2010 06:31
14 lines
1760 bytes
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