Seite 1 von 1

Vererbung & Ausdrücke

Verfasst: Dienstag 31. Mai 2016, 17:38
von nezzcarth
Hallo :)

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?

Re: Vererbung & Ausdrücke

Verfasst: Dienstag 31. Mai 2016, 18:11
von snafu
Ein bedingter Ausdruck ist an jeder Stelle möglich, wo ein Bezeichner stehen kann. Ich fände es komisch, wenn die Grammatik hier bei Klassendefinitionen eine Ausnahme machen würde.

Ein Anwendungsbeispiel, wo dieses Vorgehen sinnvoll wäre, sehe ich jedoch nicht. Wenn man verschiedene Klassen auf die gleiche Art erweitern möchte, dann verwendet man normalerweise Mixins.

Re: Vererbung & Ausdrücke

Verfasst: Dienstag 31. Mai 2016, 18:50
von BlackJack
@nezzcarth: Das dort Ausdrücke stehen können kann man beispielsweise mit `collections.namedtuple()` sinnvoll nutzen wenn man zusätzliche Methoden haben möchte:

Code: Alles auswählen

class Point(namedtuple('Point', 'x y')):

    def distance_to(self, other):
        return sqrt((self.x - other.x)**2 + (self.y - other.y)**2)
Ansonsten schliesse ich mich snafu an, dass es die Grammatik an der Stelle komplizierter machen würde wenn man die Ausdrücke die dort möglich sind einschränken würde.

Re: Vererbung & Ausdrücke

Verfasst: Sonntag 5. Juni 2016, 15:26
von nezzcarth
Danke für das Beispiel, BlackJack.

Ja, es stimmt natürlich, dass eine zusätzliche Einschränkung hier eher seltsam wäre (im Grunde ist das Zeile 8 des Python-Zen). Ich finde es trotzdem ungünstig, dass an der Stelle gewissermaßen ein toter Winkel existiert, der aus der Interaktion zweier Prinzipien entsteht und man "(halb)wirkungslosen Code" schreiben kann; wie man's besser machen kann, wüsste ich allerdings auch nicht :)

Re: Vererbung & Ausdrücke

Verfasst: Sonntag 5. Juni 2016, 15:33
von Sirius3
@nezzcarth: man kann so ziemlich überall „wirkungslosen“ Code schreiben. Wollte man das überall verbieten hätte man einen Compiler von der Komplexität von C++.