import string
class Luokkatyyppi:
def __init__(self, *tyyppi):
self.tyyppi=tuple(tyyppi)
def lisaa_tyyppi(self, tyyppi):
a=list(self.tyyppi)
a.append(tyyppi)
self.tyyppi=a
def on_tyyppia(self, tyyppi):
return tyyppi in self.tyyppi
def __str__(self):
return string.join(
map(lambda x: x.__name__, self.tyyppi), ', ')
class Yliluokka:
def __init__(self):
self.tyyppi=Luokkatyyppi(Yliluokka)
def on_tyyppia(self, tyyppi):
return self.tyyppi.on_tyyppia(tyyppi)
def tulosta_tyypit(self):
print 'Tyypit:', self.tyyppi
def tee(self, k):
print 'Teenpä jotain',k
def suorita(self, met, *args):
if met=='tee':
apply(self.tee, args)
elif met=='tee3':
print 'Tee3:',args
else:
print 'Virhe: Metodia',met,\
'ei tunnistettu luokassa',\
self.__class__.__name__,'!'
class Aliluokka:
def __init__(self):
self.yli=Yliluokka()
self.tyyppi=Luokkatyyppi(Aliluokka, Yliluokka)
def on_tyyppia(self, tyyppi):
return self.tyyppi.on_tyyppia(tyyppi)
def tulosta_tyypit(self):
print 'Tyypit:', self.tyyppi
def tee(self, k):
self.yli.tee(k)
print 'Teinpä muutakin'
def suorita(self, met, *args):
if met=='tee':
apply(self.tee, args)
elif met=='tee2':
self.yli.suorita('tee', *args)
print 'Teinpä muutakin'
else:
print 'Virhe: Metodia',met,\
'ei tunnistettu luokassa',\
self.__class__.__name__,\
' yritetään yliluokista...'
self.yli.suorita(met, *args)
if __name__=='__main__':
y=Yliluokka()
a=Aliluokka()
print 'Aliluokan tyyppi on:',a.tyyppi
print
if a.on_tyyppia(Yliluokka):
print 'Aliluokka on tyyppiä Yliluokka'
else:
print 'Aliluokka ei ole tyyppiä Yliluokka'
print 'Aliluokka tyyppiä Luokkatyyppi (1=on, 0=ei)?',\
a.on_tyyppia(Luokkatyyppi)
print
print 'ali.tee(23)'
a.tee(23)
print
print "ali.suorita('tee', 23)"
a.suorita('tee', 23)
print
print "ali.suorita('tee2', 23)"
a.suorita('tee2', 23)
print
print "ali.suorita('tee3', 23)"
a.suorita('tee3', 23)
print
print "ali.suorita('tee4', 23)"
a.suorita('tee4', 23)