mir ist letztens klar geworden, dass man in Python soetwas schreiben kann:
(Python 3.5.1)
Code: Alles auswählen
import inspect
from random import choice
SWITCH = True
class Test(int if SWITCH else float):
def __init__(self):
pass
print(inspect.getmro(Test))
SWITCH = False
print(inspect.getmro(Test))
class Test2(choice((int, float, str))):
def __init__(self):
pass
print(inspect.getmro(Test2))
Code: Alles auswählen
$ python test.py
(<class '__main__.Test'>, <class 'int'>, <class 'object'>)
(<class '__main__.Test'>, <class 'int'>, <class 'object'>)
(<class '__main__.Test2'>, <class 'str'>, <class 'object'>)
$ python test.py
(<class '__main__.Test'>, <class 'int'>, <class 'object'>)
(<class '__main__.Test'>, <class 'int'>, <class 'object'>)
(<class '__main__.Test2'>, <class 'float'>, <class 'object'>)
Besonders sinnvoll ist das nicht, da der Ausdruck ja nur bei der Klassendefinition ausgewertet wird und ein "echtes" Kontext-bedingtes Ändern der Elternklassen zur Laufzeit nicht möglich ist.
Gibt es irgendeinen Grund bzw. eine Anwendung dafür, an der Stelle (bestimmte) Ausdrücke schreiben zu können, oder ist das einfach ein Nebeneffekt der Grammatik?
